Unity 遊戲框架搭建 2019 (三十、三十一) MenuItem 顯示順序問題 & 類的提取

在上一篇,我們得出了兩個核心的學習思路:

  1. 根據問題去學習,並收集。
  2. 主動學習,並思考適用場景。

我們今天解決 MenuItem 顯示順序問題。

目前 MenuItem 顯示如圖所示:
006tNc79gy1fzfr9xwxavj30dy05cjuf.jpg

我們來看下 MenuItem 這個屬性構造的定義。
DraggedImage.81b8883da394422a9cea317c4bfe4b51.png
第二個參數是,是否是驗證方法,目前不用理解,官網上默認是 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
	}
}

編譯後觀察菜單欄,結果如下圖所示:
006tNc79gy1fzfra0plpnj30kk0ayjyb.jpg
在最上方顯示了。順便我們把第七個示例的文件名和菜單名都改一下,都從 7.XXX 改成 1.XXX。

文件名如下:
006tNc79gy1fzfra3hcqmj31380bkac8.jpg

菜單名程式碼如下:

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
	}
}

編譯通過後菜單如下圖所示:
006tNc79gy1fzfra6bc3uj30gi09u7aq.jpg

其實菜單中的名字,還是不是合理,雖然這個示例我們是為了學習自定義快捷寫下的,但是如果時間長了,我們看到上圖的菜單欄還會懵一下。其實它的名字,應該叫做導出 UnityPackage。

我們就把菜單和目錄名都改成這個 1. 導出 UnityPackage。具體怎麼改大家應該知道了吧?

改完後的菜單如下:
006tNc79gy1fzfra95qlqj30jm0aeq9y.jpg
目錄如下:
006tNc79gy1fzfracehiuj30ze0aq40b.jpg

在上面,我們搞定了調整菜單欄順序的關鍵問題。

我們今天把剩下的順序調整完,我們先整理第八個示例。

第八個示例

我們先看第八個示例的第一個 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("要複製的關鍵字");
		}

程式碼中,菜單從二級變成,一級了,並且了添加了順序,是第二個順序。
等程式碼編譯後,菜單展示如下所示:
006tNc79gy1fzfrb3zwg9j30ae06gdi2.jpg
順序是正確的。但是第一個示例和第二個示例之間有一個分割線。為什麼會有這個分割線呢?

有可能是因為 第一個示例,設置的順序是 -10,而第二個示例設置的順序是 2,中間相差太多了。
那麼我們把第一個示例的順序改成 1 試試。改動後的程式碼就不展示了。
改動之後,菜單如下圖所示:
006tNc79gy1fzfrb6sdi1j30a3066wgo.jpg
橫線消失了,不過這個分割線算是意外的收穫,我們可以好好利用它,比如用它來好好劃分我們的菜單結構,題外話就先不說了。我們接著往下整理。

第二個示例的菜單整理好了,文件夾要怎麼整理?現在這個示例的 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;
		}
	}
}

程式碼所在文件目錄如下圖:
006tNc79gy1fzfrbb1jbzj30y2094q4e.jpg
那麼第二個示例就算整理完成了。

單獨把 CommonUtil 放在一個文件夾里的原因是與」方法所在類名」這個問題是一樣的。都是方法所在的類不合理,所以會導致方法所在的類名比較奇怪。同理,類所在的文件夾不合理,所以導致菜單也不合理。因為我們的菜單的名字,和文件目錄的名字是一一對應的。

雖然沒有在文章中強調這一點,但是,筆者呢始終貫徹這個這個規則。

今天的內容就到這裡,下一篇再見,拜拜~

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

更多內容