在上一篇, 我们得出了两个核心的学习思路:
根据问题去学习, 并收集.
主动学习, 并思考适用场景.
我们今天解决 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 放在一个文件夹里的原因是与 "方法所在类名" 这个问题是一样的. 都是方法所在的类不合理, 所以会导致方法所在的类名比较奇怪. 同理, 类所在的文件夹不合理, 所以导致菜单也不合理. 因为我们的菜单的名字, 和文件目录的名字是一一对应的.
虽然没有在文章中强调这一点, 但是, 笔者呢始终贯彻这个这个规则.
今天的内容就到这里, 下一篇再见, 拜拜~
转载请注明地址: 凉鞋的笔记: http://liangxiegame.com/
更多内容
QFramework 地址: https://github.com/liangxiegame/QFramework
QQ 交流群: 623597263
Unity 进阶小班:
主要训练内容:
框架搭建训练 (第一年)
跟着案例学 Shader(第一年)
副业的孵化 (第二年, 第三年)
权益, 授课形式等具体详情请查看《小班产品手册》 https://liangxiegame.com/master/intro : https://liangxiegame.com/master/intro
关注公众号: liangxiegame 获取第一时间更新通知及更多的免费内容.
来源: http://www.bubuko.com/infodetail-3518992.html