Unity 遊戲框架搭建 2019 (二十七、二十八)棄用的程式碼警告解決&棄用的程式碼刪除
在前兩篇,我們把所有的示例重頭到尾整理了一遍。
當前的狀態如下:
- 要做的事情:
- (完成) 備份:匯出檔案,並取一個合理的名字。
- 遺留問題:
- (完成) 第八個示例與之前的示例程式碼重複,功能重複。
- (完成) 方法所在類的命名有問題。
- 選單欄顯示順序問題。
- 棄用的程式碼警告
- 約定和規則:
- 每個示例在 QFramework 目錄下建立一個資料夾,資料夾的格式是: 數字.示例的功能
- 每個示例寫一個指令碼,指令碼中包含可複用的靜態方法和 MenuItem 方法。
- 每寫一個示例進行一次匯出,匯出的檔名後邊加上日期和時間,這個功能已經在匯出功能裡內建了。
- 每次有 API 變更的時候做一次備份,備份的名字採用 QFramework_vX.Y.Z 格式。
- 每次進行整理的時候要確保是在功能有效的情況下進行刪除和變更。
- 示例分類:
- 知識學習&收集
- API 收集
- C# 語法實踐
- 庫本身的功能
- 規則實現
- 使用流程提供及優化
- 效率提升(編碼體驗、邏輯複用)
- 專案實用工具收集
- 知識學習&收集
我們看下以上遺留問題裡,示例重複這個做完了,還差一個選單欄顯示順序問題,還有一個棄用的程式碼的警告。
兩個看起來,棄用程式碼的警告馬上就有思路了,就只要保證功能正確的情況下重寫程式碼就好了。
我們看下編輯器的棄用程式碼警告:
目前有 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);
}
}
}
刪除的步驟如下:
- 對方法的名稱,進行引用搜索,IDE 裡一般右鍵會有個 Find Refenreces/Usages,大概這樣的,如果有的話,就逐個進行解決。
- 對方法的名稱,進行全域性文字搜尋,一般在 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));
}
}
}
到目前為止,我們把所有的棄用的方法全部刪除了。
全部刪除之後,筆者的心情輕鬆了很多。
小結
當前的狀態如下:
- 要做的事情:
- (完成) 備份:匯出檔案,並取一個合理的名字。
- 遺留問題:
- (完成) 第八個示例與之前的示例程式碼重複,功能重複。
- (完成) 方法所在類的命名有問題。
- 選單欄顯示順序問題。
- (完成) 棄用的程式碼警告
- 約定和規則:
- 每個示例在 QFramework 目錄下建立一個資料夾,資料夾的格式是: 數字.示例的功能
- 每個示例寫一個指令碼,指令碼中包含可複用的靜態方法和 MenuItem 方法。
- 每寫一個示例進行一次匯出,匯出的檔名後邊加上日期和時間,這個功能已經在匯出功能裡內建了。
- 每次有 API 變更的時候做一次備份,備份的名字採用 QFramework_vX.Y.Z 格式。
- 每次進行整理的時候要確保是在功能有效的情況下進行刪除和變更。
- 在刪除棄用程式碼的步驟:
- 消除棄用警告。
- 搜尋棄用方法的引用,並逐個升級為最新的方法。
- 全域性搜尋方法名,並根據情況逐個升級為新的方法。
- 示例分類:
- 知識學習&收集
- API 收集
- C# 語法實踐
- 庫本身的功能
- 規則實現
- 使用流程提供及優化
- 效率提升(編碼體驗、邏輯複用)
- 專案實用工具收集
- 知識學習&收集
注意:在約定和規則部分,增加了刪除棄用程式碼的步驟。
今天內容就這些,我們在下篇接著整理。
轉載請註明地址:涼鞋的筆記:liangxiegame.com
更多內容
-
QFramework 地址:https://github.com/liangxiegame/QFramework
-
QQ 交流群:623597263
-
Unity 進階小班:
- 主要訓練內容:
- 框架搭建訓練(第一年)
- 跟著案例學 Shader(第一年)
- 副業的孵化(第二年、第三年)
- 權益、授課形式等具體詳情請檢視《小班產品手冊》:https://liangxiegame.com/master/intro
- 主要訓練內容:
-
關注公眾號:liangxiegame 獲取第一時間更新通知及更多的免費內容。