1. 程式人生 > >Unity 遊戲框架搭建 2019 (二十七、二十八)棄用的程式碼警告解決&棄用的程式碼刪除

Unity 遊戲框架搭建 2019 (二十七、二十八)棄用的程式碼警告解決&棄用的程式碼刪除

在前兩篇,我們把所有的示例重頭到尾整理了一遍。

當前的狀態如下:

  1. 要做的事情:
    • (完成) 備份:匯出檔案,並取一個合理的名字。
  2. 遺留問題:
    • (完成) 第八個示例與之前的示例程式碼重複,功能重複。
    • (完成) 方法所在類的命名有問題。
    • 選單欄顯示順序問題。
    • 棄用的程式碼警告
  3. 約定和規則:
    • 每個示例在 QFramework 目錄下建立一個資料夾,資料夾的格式是: 數字.示例的功能
    • 每個示例寫一個指令碼,指令碼中包含可複用的靜態方法和 MenuItem 方法。
    • 每寫一個示例進行一次匯出,匯出的檔名後邊加上日期和時間,這個功能已經在匯出功能裡內建了。
    • 每次有 API 變更的時候做一次備份,備份的名字採用 QFramework_vX.Y.Z 格式。
    • 每次進行整理的時候要確保是在功能有效的情況下進行刪除和變更。
  4. 示例分類:
    1. 知識學習&收集
      • API 收集
      • C# 語法實踐
    2. 庫本身的功能
      • 規則實現
      • 使用流程提供及優化
      • 效率提升(編碼體驗、邏輯複用)
      • 專案實用工具收集

我們看下以上遺留問題裡,示例重複這個做完了,還差一個選單欄顯示順序問題,還有一個棄用的程式碼的警告。

兩個看起來,棄用程式碼的警告馬上就有思路了,就只要保證功能正確的情況下重寫程式碼就好了。

我們看下編輯器的棄用程式碼警告:

目前有 5 個警告,主要集中在示例 7 和把中。我們一項一項解決。

先看示例七的程式碼:

using System.IO;

#if UNITY_EDITOR
using UnityEditor;
#endif

using UnityEngine;

namespace QFramework
{
	public class CustomShortCut : MonoBehaviour
	{
#if UNITY_EDITOR
		[MenuItem("QFramework/7.自定義快捷鍵 %e")]
		private static void MenuClicked()
		{
			var generatePackageName = PreviousFunctions.GenerateUnityPackageName();
			
			PreviousFunctions.ExportPackage("Assets/QFramework",generatePackageName + ".unitypackage");
			
			PreviousFunctions.OpenInFolder(Path.Combine(Application.dataPath, "../"));
		}
#endif
	}
}

很容易改。改完之後的程式碼如下:

using System.IO;

#if UNITY_EDITOR
using UnityEditor;
#endif

using UnityEngine;

namespace QFramework
{
	public class CustomShortCut : MonoBehaviour
	{
#if UNITY_EDITOR
		[MenuItem("QFramework/7.自定義快捷鍵 %e")]
		private static void MenuClicked()
		{
			var generatePackageName = Exporter.GenerateUnityPackageName();
			
			EditorUtil.ExportPackage("Assets/QFramework",generatePackageName + ".unitypackage");
			
			EditorUtil.OpenInFolder(Path.Combine(Application.dataPath, "../"));
		}
#endif
	}
}

之後編譯後的結果如下所示:

還剩兩個,我們看下第 8 個示例的程式碼。

...
public class PreviousFunctions
{
	...
	[MenuItem("QFramework/8.總結之前的方法/3.生成檔名到剪下板")]
	private static void MenuClicked3()
	{
		CommonUtil.CopyText(GenerateUnityPackageName());		
	}
		
	[MenuItem("QFramework/8.總結之前的方法/4.匯出 UnityPackage")]
	private static void MenuClicked4()
	{
		EditorUtil.ExportPackage("Assets/QFramework",GenerateUnityPackageName() + ".unitypackage");
	}
	...
}
...

主要問題在 GenerateUnityPackageName,這個在整理第個示例的時候忘記了,改成如下程式碼就好了。

...
public class PreviousFunctions
{
	...
	[MenuItem("QFramework/8.總結之前的方法/3.生成檔名到剪下板")]
	private static void MenuClicked3()
	{
		CommonUtil.CopyText(Exporter.GenerateUnityPackageName());		
	}
		
	[MenuItem("QFramework/8.總結之前的方法/4.匯出 UnityPackage")]
	private static void MenuClicked4()
	{
		EditorUtil.ExportPackage("Assets/QFramework",Exporter.GenerateUnityPackageName() + ".unitypackage");
	}
	...
}
...

這樣編譯警告就沒有了。

警告的問題全部解決了,棄用的方法就全部可以刪掉了,因為棄用的方法,只要被呼叫了才會報警告,但是在刪除棄用方法的時候要小心一點,因為棄用的方法有可能是在某個巨集裡邊呼叫的,這時候最好用一下 IDE 的全域性搜尋字串,一般 IDE 都會有,怎麼用,自己用搜索引擎查一下就行了。

我們在這篇把所有的棄用程式碼刪除掉。

示例十

程式碼如下


using System;
#if UNITY_EDITOR
using UnityEditor;
#endif

using UnityEngine;

namespace QFramework
{
	public class TransformLocalPosImprovements
	{
#if UNITY_EDITOR
		[MenuItem("QFramework/10.Transform 賦值優化")]
#endif
		private static void GenerateUnityPackageName()
		{
			var transform = new GameObject("transform").transform;

			TransformSimplify.SetLocalPosX(transform, 5.0f);
			TransformSimplify.SetLocalPosY(transform, 5.0f);
			TransformSimplify.SetLocalPosZ(transform, 5.0f);
		}

		[Obsolete("方法已棄用,請使用 TransformSimplify")]
		public static void SetLocalPosX(Transform transform, float x)
		{
			TransformSimplify.SetLocalPosX(transform, x);
		}
		
		[Obsolete("方法已棄用,請使用 TransformSimplify")]
		public static void SetLocalPosY(Transform transform, float y)
		{
			TransformSimplify.SetLocalPosY(transform, y);
		}
		
		[Obsolete("方法已棄用,請使用 TransformSimplify")]
		public static void SetLocalPosZ(Transform transform, float z)
		{
			TransformSimplify.SetLocalPosZ(transform, z);
		}
		
		[Obsolete("方法已棄用,請使用 TransformSimplify")]
		public static void SetLocalPosXY(Transform transform, float x, float y)
		{
			TransformSimplify.SetLocalPosXY(transform, x, y);
		}
		
		[Obsolete("方法已棄用,請使用 TransformSimplify")]
		public static void SetLocalPosXZ(Transform transform, float x, float z)
		{
			TransformSimplify.SetLocalPosXZ(transform, x, z);
		}
		
		[Obsolete("方法已棄用,請使用 TransformSimplify")]
		public static void SetLocalPosYZ(Transform transform, float y, float z)
		{
			TransformSimplify.SetLocalPosYZ(transform, y, z);
		}
	}
}

刪除的步驟如下:

  1. 對方法的名稱,進行引用搜索,IDE 裡一般右鍵會有個 Find Refenreces/Usages,大概這樣的,如果有的話,就逐個進行解決。
  2. 對方法的名稱,進行全域性文字搜尋,一般在 IDE 裡快捷鍵是 cmd/ctrl + shift + F,如果不是可以自己搜一下。經過步驟 1 之後,在執行本操作,結果很可能是在巨集定義裡的引用,這時候就需要用肉眼去檢查了,看看是不是最新的方法,如果不是就更新。

每一個棄用的方法我們都要這樣一個一個去解決。

解決按之後程式碼如下:

#if UNITY_EDITOR
using UnityEditor;
#endif

using UnityEngine;

namespace QFramework
{
	public class TransformLocalPosImprovements
	{
#if UNITY_EDITOR
		[MenuItem("QFramework/10.Transform 賦值優化")]
#endif
		private static void GenerateUnityPackageName()
		{
			var transform = new GameObject("transform").transform;

			TransformSimplify.SetLocalPosX(transform, 5.0f);
			TransformSimplify.SetLocalPosY(transform, 5.0f);
			TransformSimplify.SetLocalPosZ(transform, 5.0f);
		}
	}
}

第十個示例解決了。

示例八

使用以上的步驟,整理後的示例程式碼如下:

#if UNITY_EDITOR
using UnityEditor;
#endif

using UnityEngine;
using System;
using System.IO;

namespace QFramework
{
	public class CommonUtil
	{
		public static void CopyText(string text)
		{
			GUIUtility.systemCopyBuffer = text;
		}
	}

	public class Exporter
	{
		public static string GenerateUnityPackageName()
		{
			return "QFramework_" + DateTime.Now.ToString("yyyyMMdd_hh");
		}
	}

	public class EditorUtil
	{
#if UNITY_EDITOR
		public static void CallMenuItem(string menuPath)
		{
			EditorApplication.ExecuteMenuItem(menuPath);
		}

		public static void OpenInFolder(string folderPath)
		{
			Application.OpenURL("file:///" + folderPath);
		}
		
		public static void ExportPackage(string assetPathName,string fileName)
		{
			AssetDatabase.ExportPackage(assetPathName, fileName, ExportPackageOptions.Recurse);
		}
#endif
	}

	public class PreviousFunctions : MonoBehaviour
	{		
#if UNITY_EDITOR
		[MenuItem("QFramework/8.總結之前的方法/1.獲取檔名")]
		private static void MenuClicked()
		{
			Debug.Log(Exporter.GenerateUnityPackageName());
		}
		
		[MenuItem("QFramework/8.總結之前的方法/2.複製文字到剪下板")]
		private static void MenuClicked2()
		{
			CommonUtil.CopyText("要複製的關鍵字");
		}

		[MenuItem("QFramework/8.總結之前的方法/3.生成檔名到剪下板")]
		private static void MenuClicked3()
		{
			CommonUtil.CopyText(Exporter.GenerateUnityPackageName());		
		}
		
		[MenuItem("QFramework/8.總結之前的方法/4.匯出 UnityPackage")]
		private static void MenuClicked4()
		{
			EditorUtil.ExportPackage("Assets/QFramework",Exporter.GenerateUnityPackageName() + ".unitypackage");
		}
		
		[MenuItem("QFramework/8.總結之前的方法/5.開啟所在資料夾")]
		private static void MenuClicked5()
		{
			EditorUtil.OpenInFolder(Application.dataPath);
		}
		
		[MenuItem("QFramework/8.總結之前的方法/6.MenuItem 複用")]
		private static void MenuClicked6()
		{
			EditorUtil.CallMenuItem("QFramework/8.總結之前的方法/4.匯出 UnityPackage");
			EditorUtil.OpenInFolder(Path.Combine(Application.dataPath, "../"));
		}
#endif
	}
 }

是不是感覺清爽了很多?哈哈哈。

示例十一

整理之後程式碼如下:


using System;
#if UNITY_EDITOR
using UnityEditor;
#endif

using UnityEngine;

namespace QFramework
{
	public class TransformSimplify
	{
		/// <summary>
		/// 重置操作
		/// </summary>
		/// <param name="trans">Trans.</param>
		public static void Identity(Transform trans)
		{
			trans.localPosition = Vector3.zero;
			trans.localScale = Vector3.one;
			trans.localRotation = Quaternion.identity;
		}
		
		public static void SetLocalPosX(Transform transform, float x)
		{
			var localPos = transform.localPosition;
			localPos.x = x;
			transform.localPosition = localPos;
		}
		
		public static void SetLocalPosY(Transform transform, float y)
		{
			var localPos = transform.localPosition;
			localPos.y = y;
			transform.localPosition = localPos;
		}
		
		public static void SetLocalPosZ(Transform transform, float z)
		{
			var localPos = transform.localPosition;
			localPos.z = z;
			transform.localPosition = localPos;
		}
		
		public static void SetLocalPosXY(Transform transform, float x, float y)
		{
			var localPos = transform.localPosition;
			localPos.x = x;
			localPos.y = y;
			transform.localPosition = localPos;
		}
		
		public static void SetLocalPosXZ(Transform transform, float x, float z)
		{
			var localPos = transform.localPosition;
			localPos.x = x;
			localPos.z = z;
			transform.localPosition = localPos;
		}
		
		public static void SetLocalPosYZ(Transform transform, float y, float z)
		{
			var localPos = transform.localPosition;
			localPos.y = y;
			localPos.z = z;
			transform.localPosition = localPos;
		}
	}
	
	public class TransformIdentity : MonoBehaviour
	{
		
#if UNITY_EDITOR
		[MenuItem("QFramework/11.Transform 歸一化")]
#endif
		private static void MenuClicked()
		{
			var transform = new GameObject("transform").transform;

			TransformSimplify.Identity(transform);
		}
	}
}

示例十二

整理之後程式碼如下:

using System;

#if UNITY_EDITOR
using UnityEditor;
#endif

using UnityEngine;
using Random = UnityEngine.Random;

namespace QFramework
{
	public class MathUtil
	{
		/// <summary>
		/// 輸入百分比返回是否命中概率
		/// </summary>
		public static bool Percent(int percent)
		{
			return Random.Range (0, 100) <= percent;
		}
	}
	public class PercentFunction : MonoBehaviour
	{
#if UNITY_EDITOR
		[MenuItem("QFramework/12.概率函式")]
#endif
		private static void MenuClicked()
		{
			Debug.Log(MathUtil.Percent(50));
		}
	}
}

到目前為止,我們把所有的棄用的方法全部刪除了。

全部刪除之後,筆者的心情輕鬆了很多。

小結

當前的狀態如下:

  1. 要做的事情:
    • (完成) 備份:匯出檔案,並取一個合理的名字。
  2. 遺留問題:
    • (完成) 第八個示例與之前的示例程式碼重複,功能重複。
    • (完成) 方法所在類的命名有問題。
    • 選單欄顯示順序問題。
    • (完成) 棄用的程式碼警告
  3. 約定和規則:
    • 每個示例在 QFramework 目錄下建立一個資料夾,資料夾的格式是: 數字.示例的功能
    • 每個示例寫一個指令碼,指令碼中包含可複用的靜態方法和 MenuItem 方法。
    • 每寫一個示例進行一次匯出,匯出的檔名後邊加上日期和時間,這個功能已經在匯出功能裡內建了。
    • 每次有 API 變更的時候做一次備份,備份的名字採用 QFramework_vX.Y.Z 格式。
    • 每次進行整理的時候要確保是在功能有效的情況下進行刪除和變更。
    • 在刪除棄用程式碼的步驟:
      1. 消除棄用警告。
      2. 搜尋棄用方法的引用,並逐個升級為最新的方法。
      3. 全域性搜尋方法名,並根據情況逐個升級為新的方法。
  4. 示例分類:
    1. 知識學習&收集
      • API 收集
      • C# 語法實踐
    2. 庫本身的功能
      • 規則實現
      • 使用流程提供及優化
      • 效率提升(編碼體驗、邏輯複用)
      • 專案實用工具收集

注意:在約定和規則部分,增加了刪除棄用程式碼的步驟。

今天內容就這些,我們在下篇接著整理。

轉載請註明地址:涼鞋的筆記:liangxiegame.com

更多內容

  • QFramework 地址:https://github.com/liangxiegame/QFramework

  • QQ 交流群:623597263

  • Unity 進階小班:

    • 主要訓練內容:
      • 框架搭建訓練(第一年)
      • 跟著案例學 Shader(第一年)
      • 副業的孵化(第二年、第三年)
    • 權益、授課形式等具體詳情請檢視《小班產品手冊》:https://liangxiegame.com/master/intro
  • 關注公眾號:liangxiegame 獲取第一時間更新通知及更多的免費內容。