1. 程式人生 > >Unity 遊戲框架搭建 2019 (三十、三十一) MenuItem 顯示順序問題 & 類的提取

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

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

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

我們今天解決 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 獲取第一時間更新通知及更多的免費內容。