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

更多内容

  • QFramework 地址:https://github.com/liangxiegame/QFramework

  • QQ 交流群:623597263

  • Unity 进阶小班

    • 主要训练内容:
      • 框架搭建训练(第一年)
      • 跟着案例学 Shader(第一年)
      • 副业的孵化(第二年、第三年)
    • 权益、授课形式等具体详情请查看《小班产品手册》:https://liangxiegame.com/master/intro
  • 关注公众号:liangxiegame 获取第一时间更新通知及更多的免费内容。