Unity 遊戲框架搭建 2019 (三十、三十一) MenuItem 顯示順序問題 & 類的提取
在上一篇,我們得出了兩個核心的學習思路:
- 根據問題去學習,並收集。
- 主動學習,並思考適用場景。
我們今天解決 MenuItem 顯示順序問題。
目前 MenuItem 顯示如圖所示:
我們來看下 MenuItem 這個屬性構造的定義。
第二個引數是,是否是驗證方法,目前不用理解,官網上預設是 false。
第三個引數,意思是優先順序,表示 MenuItem 所在的顯示順序,數值越大越在底部。
我們先給第七個示例試一下。將程式碼改成如下:
using System.IO; #if UNITY_EDITOR using UnityEditor; #endif using UnityEngine; namespace QFramework { public class CustomShortCut : MonoBehaviour { #if UNITY_EDITOR [MenuItem("QFramework/7.自定義快捷鍵 %e",false,-10)] private static void MenuClicked() { var generatePackageName = Exporter.GenerateUnityPackageName(); EditorUtil.ExportPackage("Assets/QFramework",generatePackageName + ".unitypackage"); EditorUtil.OpenInFolder(Path.Combine(Application.dataPath, "../")); } #endif } }
編譯後觀察選單欄,結果如下圖所示:
在最上方顯示了。順便我們把第七個示例的檔名和選單名都改一下,都從 7.XXX 改成 1.XXX。
檔名如下:
選單名程式碼如下:
using System.IO; #if UNITY_EDITOR using UnityEditor; #endif using UnityEngine; namespace QFramework { public class CustomShortCut : MonoBehaviour { #if UNITY_EDITOR [MenuItem("QFramework/1.自定義快捷鍵 %e",false,-10)] private static void MenuClicked() { var generatePackageName = Exporter.GenerateUnityPackageName(); EditorUtil.ExportPackage("Assets/QFramework",generatePackageName + ".unitypackage"); EditorUtil.OpenInFolder(Path.Combine(Application.dataPath, "../")); } #endif } }
編譯通過後選單如下圖所示:
其實選單中的名字,還是不是合理,雖然這個示例我們是為了學習自定義快捷寫下的,但是如果時間長了,我們看到上圖的選單欄還會懵一下。其實它的名字,應該叫做匯出 UnityPackage。
我們就把選單和目錄名都改成這個 1. 匯出 UnityPackage。具體怎麼改大家應該知道了吧?
改完後的選單如下:
目錄如下:
在上面,我們搞定了調整選單欄順序的關鍵問題。
我們今天把剩下的順序調整完,我們先整理第八個示例。
第八個示例
我們先看第八個示例的第一個 MenuItem,程式碼如下。
[MenuItem("QFramework/8.總結之前的方法/1.獲取檔名")] private static void MenuClicked() { Debug.Log(Exporter.GenerateUnityPackageName()); }
其中的 “QFramework/8.總結之前的方法/1.獲取檔名” 我們可以改成 “QFramework/2.總結之前的方法/1.獲取檔名”
不過這個總結的功能,對我們來說沒有太大的作用了,因為我們在剛剛完成的第一個示例中,已經包含了 Exporter.GenerateUnityPackageName 的使用方式了。
第一個示例程式碼如下:
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,-10)]
private static void MenuClicked()
{
var generatePackageName = Exporter.GenerateUnityPackageName();
EditorUtil.ExportPackage("Assets/QFramework",generatePackageName + ".unitypackage");
EditorUtil.OpenInFolder(Path.Combine(Application.dataPath, "../"));
}
#endif
}
}
所以,我們刪掉第八個示例中的這個 MenuItem 方法就好了。
再看第二個 MenuItem 程式碼如下:
[MenuItem("QFramework/8.總結之前的方法/2.複製文字到剪下板")]
private static void MenuClicked2()
{
CommonUtil.CopyText("要複製的關鍵字");
}
程式碼中 CommonUtil.CopyText 的使用,沒有在第一個示例中包含。所以這個 MenuItem 要保留。
這個呢可以留著,我們對這段程式碼的 MenuItem 進行改進。改進後代碼如下所示:
[MenuItem("QFramework/2.複製文字到剪下板",false,2)]
private static void MenuClicked2()
{
CommonUtil.CopyText("要複製的關鍵字");
}
程式碼中,選單從二級變成,一級了,並且了添加了順序,是第二個順序。
等程式碼編譯後,選單展示如下所示:
順序是正確的。但是第一個示例和第二個示例之間有一個分割線。為什麼會有這個分割線呢?
有可能是因為 第一個示例,設定的順序是 -10,而第二個示例設定的順序是 2,中間相差太多了。
那麼我們把第一個示例的順序改成 1 試試。改動後的程式碼就不展示了。
改動之後,選單如下圖所示:
橫線消失了,不過這個分割線算是意外的收穫,我們可以好好利用它,比如用它來好好劃分我們的選單結構,題外話就先不說了。我們接著往下整理。
第二個示例的選單整理好了,資料夾要怎麼整理?現在這個示例的 MenuItem 方法在第八個示例中的 PreviousFuntions 裡,而 示例的核心 API: CommonUtil.CopyText 也在第八個示例的檔案裡。
其實很簡單,把這兩部分提取出來就好了,將 MenuItem 示例方法寫到 CommonUtil.CopyText 方法實現位置的上方。然後把 CommonUtil 這個類,單獨從 PreviousFuctions.cs 這個檔案中提取出來,放到第二個示例中。
程式碼如下:
CommonUtil.cs
using UnityEngine;
namespace QFramework
{
public class CommonUtil
{
#if UNITY_EDITOR
[UnityEditor.MenuItem("QFramework/2.複製文字到剪下板", false, 2)]
#endif
private static void MenuClicked2()
{
CopyText("要複製的關鍵字");
}
public static void CopyText(string text)
{
GUIUtility.systemCopyBuffer = text;
}
}
}
程式碼所在檔案目錄如下圖:
那麼第二個示例就算整理完成了。
單獨把 CommonUtil 放在一個資料夾裡的原因是與”方法所在類名”這個問題是一樣的。都是方法所在的類不合理,所以會導致方法所在的類名比較奇怪。同理,類所在的資料夾不合理,所以導致選單也不合理。因為我們的選單的名字,和檔案目錄的名字是一一對應的。
雖然沒有在文章中強調這一點,但是,筆者呢始終貫徹這個這個規則。
今天的內容就到這裡,下一篇再見,拜拜~
轉載請註明地址:涼鞋的筆記:liangxiegame.com
更多內容
-
QFramework 地址:https://github.com/liangxiegame/QFramework
-
QQ 交流群:623597263
-
Unity 進階小班:
- 主要訓練內容:
- 框架搭建訓練(第一年)
- 跟著案例學 Shader(第一年)
- 副業的孵化(第二年、第三年)
- 權益、授課形式等具體詳情請檢視《小班產品手冊》:https://liangxiegame.com/master/intro
- 主要訓練內容:
-
關注公眾號:liangxiegame 獲取第一時間更新通知及更多的免費內容。