昨天我們完成了第八個示例的第二個 MenuItem 選單順序的調整。
我們今天再往下接著調整。
我們來看下接下來的 MenuItem
程式碼如下:
[MenuItem("QFramework/8.總結之前的方法/3.生成檔名到剪下板")]
private static void MenuClicked3()
{
CommonUtil.CopyText(Exporter.GenerateUnityPackageName());
}
CommonUtil 已經提取成第二個示例了。
Exporter.GenerateUnityPackageName() 這個方法的定義在第八個示例 PreviousFunctions 類的上方。它屬於專門為匯出功能定製的程式碼,也就是在其他情況下不適用的。
而這個 MenuItem 本身呢,現在沒有太大的用處。有用的部分是 Exporter.GenerateUnityPackageName 的方法定義和所在的類。
所以這個 MenuItem 就直接刪除了。
刪除之後,我們把 Exporter 這個類移動到第一個示例裡,因為第一個示例是匯出功能所在的地方,Exporter 類呢本身就是一個匯出功能的一部分。
第一個示例原來的程式碼如下:
using System.IO;
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
namespace QFramework
{
public class CustomShortCut : MonoBehaviour
{
#if UNITY_EDITOR
[MenuItem("QFramework/1.匯出 UnityPackage %e",false,1)]
private static void MenuClicked()
{
var generatePackageName = Exporter.GenerateUnityPackageName();
EditorUtil.ExportPackage("Assets/QFramework",generatePackageName + ".unitypackage");
EditorUtil.OpenInFolder(Path.Combine(Application.dataPath, "../"));
}
#endif
}
}
移動 Exporter 類之後變成如下:
using System;
using System.IO;
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
namespace QFramework
{
public class Exporter
{
public static string GenerateUnityPackageName()
{
return "QFramework_" + DateTime.Now.ToString("yyyyMMdd_hh");
}
}
public class CustomShortCut : MonoBehaviour
{
#if UNITY_EDITOR
[MenuItem("QFramework/1.匯出 UnityPackage %e",false,1)]
private static void MenuClicked()
{
var generatePackageName = Exporter.GenerateUnityPackageName();
EditorUtil.ExportPackage("Assets/QFramework",generatePackageName + ".unitypackage");
EditorUtil.OpenInFolder(Path.Combine(Application.dataPath, "../"));
}
#endif
}
}
到這裡,我們發現,Exporter 類可以和 CunstomShortCut 類進行合併,合併之後的類名是 Exporter,而程式碼的檔名改成了 Exporter.cs。
程式碼如下:
Exporter.cs
using System;
using System.IO;
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
namespace QFramework
{
public class Exporter
{
#if UNITY_EDITOR
[MenuItem("QFramework/1.匯出 UnityPackage %e",false,1)]
private static void MenuClicked()
{
var generatePackageName = Exporter.GenerateUnityPackageName();
EditorUtil.ExportPackage("Assets/QFramework",generatePackageName + ".unitypackage");
EditorUtil.OpenInFolder(Path.Combine(Application.dataPath, "../"));
}
#endif
public static string GenerateUnityPackageName()
{
return "QFramework_" + DateTime.Now.ToString("yyyyMMdd_hh");
}
}
}
目錄結構如下:
這樣第八個示例的第三個 MenuItem 就整理完畢了。
小結
其實在整理第一個示例的時候,第一個示例的類的名字 CustomShortCut 就有很大的問題。我們第一個示例的功能是 匯出 UnityPackage,類名卻叫 自定義快捷鍵,這樣比較奇怪。但是當時沒有發現,因為只去關注選單名是否和資料夾名是否一致了,沒有考慮類名是否合理。
所以呢,我們的規範和約定要加入上一個條例:
- 要給類/程式碼檔案取合適的命名。
加上之後如下:
約定和規則:
- 每個示例在 QFramework 目錄下建立一個資料夾,資料夾的格式是: 數字.示例的功能
- 每個示例寫一個指令碼,指令碼中包含可複用的靜態方法和 MenuItem 方法。
- 每寫一個示例進行一次匯出,匯出的檔名後邊加上日期和時間,這個功能已經在匯出功能裡內建了。
- 每次有 API 變更的時候做一次備份,備份的名字採用 QFramework_vX.Y.Z 格式。
- 每次進行整理的時候要確保是在功能有效的情況下進行刪除和變更。
- 確保選單名和資料夾名一致(新增)
- 要給類/程式碼檔案取合適的命名(新增)
- 在刪除棄用程式碼的步驟:
- 消除棄用警告。
- 搜尋棄用方法的引用,並逐個升級為最新的方法。
- 全域性搜尋方法名,並根據情況逐個升級為新的方法。
在上面 我們通過第八個示例的第三個 MenuItem 方法,我們更新了約定和規則。
我們接著往下整理。
第八個示例的第四個 MenuItem 方法
[MenuItem("QFramework/8.總結之前的方法/4.匯出 UnityPackage")]
private static void MenuClicked4()
{
EditorUtil.ExportPackage("Assets/QFramework",Exporter.GenerateUnityPackageName() + ".unitypackage");
}
這個 MenuItem 可以刪除了,因為功能已經在第一個示例實現過了。
第八個示例的第五個 MenuItem 方法
[MenuItem("QFramework/8.總結之前的方法/5.開啟所在資料夾")]
private static void MenuClicked5()
{
EditorUtil.OpenInFolder(Application.dataPath);
}
同樣也刪除了。
第八個示例的第六個 MenuItem 方法
[MenuItem("QFramework/8.總結之前的方法/6.MenuItem 複用")]
private static void MenuClicked6()
{
EditorUtil.CallMenuItem("QFramework/8.總結之前的方法/4.匯出 UnityPackage");
EditorUtil.OpenInFolder(Path.Combine(Application.dataPath, "../"));
}
這個不能馬上刪除,因為這是 EditorUtil.CallMenuItem 僅有的一個呼叫的地方。
所以要留著,但是這個功能其實已經失效了,因為 "QFramework/8.總結之前的方法/4.匯出 UnityPackage" 這個 MenuItem 被我們剛才刪掉了。好吧,這種危險的操作又做了一次。
不過沒關係,因為不是很重要的功能,還好損失不大。那麼這個 MenuItem 方法呢,要改成如下:
public class PreviousFunctions : MonoBehaviour
{
#if UNITY_EDITOR
[MenuItem("QFramework/3.MenuItem 複用",false,3)]
private static void MenuClicked()
{
EditorUtil.CallMenuItem("QFramework/2.複製文字到剪下板");
}
#endif
}
程式碼很容易理解。選單名字改變了,所以我們的資料夾和類名都要改變。
更改後的目錄如下:
程式碼如下:
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
using System;
using System.IO;
namespace QFramework
{
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 ReuseMenuItem : MonoBehaviour
{
#if UNITY_EDITOR
[MenuItem("QFramework/3.MenuItem 複用",false, 3)]
private static void MenuClicked()
{
EditorUtil.CallMenuItem("QFramework/2.複製文字到剪下板");
}
#endif
}
}
我們發現其實還有一個類 EditorUtil,剛好 ReuseMenuItem 是 EditorUtil 中 CallMenuItem 的使用程式碼。
所以可以進行合併,合併之後程式碼如下:
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
namespace QFramework
{
public class EditorUtil
{
#if UNITY_EDITOR
[MenuItem("QFramework/3.MenuItem 複用",false,3)]
private static void MenuClicked()
{
CallMenuItem("QFramework/2.複製文字到剪下板");
}
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
}
}
但是類的名字,改變了,而類所在的檔名還是 ReuseMenuItem,這應該怎麼辦?
這是一個規則之間的互相制衡導致的衝突。
筆者的解決辦法就是,把程式碼名字改成 EditorUtil,最起碼類名和檔名一致了。功能名和選單名也一致了。而 EditorUtil 總好過一個 CustomShortCut 或者 PreviousFunctions 這樣的命名。而為什麼 EditorUtil 更好,那麼這個以後會專門講,現在呢,我們就先這樣做就好了。
檔名改完之後,目錄結構如下圖所示.
這樣完整的第八個示例,就全部整理完了,通過第八個示例整理出來了第三個示例。刪除了很多冗餘程式碼,很有成就感。
今天的內容就這些。拜拜~
轉載請註明地址:涼鞋的筆記:liangxiegame.com
更多內容
-
QFramework 地址:https://github.com/liangxiegame/QFramework
-
QQ 交流群:623597263
-
Unity 進階小班:
- 主要訓練內容:
- 框架搭建訓練(第一年)
- 跟著案例學 Shader(第一年)
- 副業的孵化(第二年、第三年)
- 權益、授課形式等具體詳情請檢視《小班產品手冊》:https://liangxiegame.com/master/intro
- 主要訓練內容:
-
關注公眾號:liangxiegame 獲取第一時間更新通知及更多的免費內容。