昨天我们完成了第八个示例的第二个 MenuItem 菜单顺序的调整.
我们今天再往下接着调整.
我们来看下接下来的 MenuItem
代码如下:
- [MenuItem("QFramework/8. 总结之前的方法 / 3. 生成文件名到剪切板")]
- private static void MenuClicked3()
- {
- CommonUtil.CopyText(Exporter.GenerateUnityPackageName());
- }
CommonUtil 已经提取成第二个示例了.
Exporter.GenerateUnityPackageName() 这个方法的定义在第八个示例 PreviousFunctions 类的上方. 它属于专门为导出功能定制的代码, 也就是在其他情况下不适用的.
而这个 MenuItem 本身呢, 现在没有太大的用处. 有用的部分是 Exporter.GenerateUnityPackageName 的方法定义和所在的类.
所以这个 MenuItem 就直接删除了.
删除之后, 我们把 Exporter 这个类移动到第一个示例里, 因为第一个示例是导出功能所在的地方, Exporter 类呢本身就是一个导出功能的一部分.
第一个示例原来的代码如下:
- 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,1)]
- private static void MenuClicked()
- {
- var generatePackageName = Exporter.GenerateUnityPackageName();
- EditorUtil.ExportPackage("Assets/QFramework",generatePackageName + ".unitypackage");
- EditorUtil.OpenInFolder(Path.Combine(Application.dataPath, "../"));
- }
- #endif
- }
- }
移动 Exporter 类之后变成如下:
- using System;
- using System.IO;
- #if UNITY_EDITOR
- using UnityEditor;
- #endif
- using UnityEngine;
- namespace QFramework
- {
- public class Exporter
- {
- public static string GenerateUnityPackageName()
- {
- return "QFramework_" + DateTime.Now.ToString("yyyyMMdd_hh");
- }
- }
- public class CustomShortCut : MonoBehaviour
- {
- #if UNITY_EDITOR
- [MenuItem("QFramework/1. 导出 UnityPackage %e",false,1)]
- private static void MenuClicked()
- {
- var generatePackageName = Exporter.GenerateUnityPackageName();
- EditorUtil.ExportPackage("Assets/QFramework",generatePackageName + ".unitypackage");
- EditorUtil.OpenInFolder(Path.Combine(Application.dataPath, "../"));
- }
- #endif
- }
- }
到这里, 我们发现, Exporter 类可以和 CunstomShortCut 类进行合并, 合并之后的类名是 Exporter, 而代码的文件名改成了 Exporter.cs.
代码如下:
Exporter.cs
- using System;
- using System.IO;
- #if UNITY_EDITOR
- using UnityEditor;
- #endif
- using UnityEngine;
- namespace QFramework
- {
- public class Exporter
- {
- #if UNITY_EDITOR
- [MenuItem("QFramework/1. 导出 UnityPackage %e",false,1)]
- private static void MenuClicked()
- {
- var generatePackageName = Exporter.GenerateUnityPackageName();
- EditorUtil.ExportPackage("Assets/QFramework",generatePackageName + ".unitypackage");
- EditorUtil.OpenInFolder(Path.Combine(Application.dataPath, "../"));
- }
- #endif
- public static string GenerateUnityPackageName()
- {
- return "QFramework_" + DateTime.Now.ToString("yyyyMMdd_hh");
- }
- }
- }
目录结构如下:
这样第八个示例的第三个 MenuItem 就整理完毕了.
小结
其实在整理第一个示例的时候, 第一个示例的类的名字 CustomShortCut 就有很大的问题. 我们第一个示例的功能是 导出 UnityPackage, 类名却叫 自定义快捷键, 这样比较奇怪. 但是当时没有发现, 因为只去关注菜单名是否和文件夹名是否一致了, 没有考虑类名是否合理.
所以呢, 我们的规范和约定要加入上一个条例:
要给类 / 代码文件取合适的命名.
加上之后如下:
约定和规则:
每个示例在 QFramework 目录下创建一个文件夹, 文件夹的格式是: 数字. 示例的功能
每个示例写一个脚本, 脚本中包含可复用的静态方法和 MenuItem 方法.
每写一个示例进行一次导出, 导出的文件名后边加上日期和时间, 这个功能已经在导出功能里内置了.
每次有 API 变更的时候做一次备份, 备份的名字采用 QFramework_vX.Y.Z 格式.
每次进行整理的时候要确保是在功能有效的情况下进行删除和变更.
确保菜单名和文件夹名一致 (新增)
要给类 / 代码文件取合适的命名 (新增)
在删除弃用代码的步骤:
消除弃用警告.
搜索弃用方法的引用, 并逐个升级为最新的方法.
全局搜索方法名, 并根据情况逐个升级为新的方法.
在上面 我们通过第八个示例的第三个 MenuItem 方法, 我们更新了约定和规则.
我们接着往下整理.
第八个示例的第四个 MenuItem 方法
- [MenuItem("QFramework/8. 总结之前的方法 / 4. 导出 UnityPackage")]
- private static void MenuClicked4()
- {
- EditorUtil.ExportPackage("Assets/QFramework",Exporter.GenerateUnityPackageName() + ".unitypackage");
- }
这个 MenuItem 可以删除了, 因为功能已经在第一个示例实现过了.
第八个示例的第五个 MenuItem 方法
- [MenuItem("QFramework/8. 总结之前的方法 / 5. 打开所在文件夹")]
- private static void MenuClicked5()
- {
- EditorUtil.OpenInFolder(Application.dataPath);
- }
同样也删除了.
第八个示例的第六个 MenuItem 方法
- [MenuItem("QFramework/8. 总结之前的方法 / 6.MenuItem 复用")]
- private static void MenuClicked6()
- {
- EditorUtil.CallMenuItem("QFramework/8. 总结之前的方法 / 4. 导出 UnityPackage");
- EditorUtil.OpenInFolder(Path.Combine(Application.dataPath, "../"));
- }
这个不能马上删除, 因为这是 EditorUtil.CallMenuItem 仅有的一个调用的地方.
所以要留着, 但是这个功能其实已经失效了, 因为 "QFramework/8. 总结之前的方法 / 4. 导出 UnityPackage" 这个 MenuItem 被我们刚才删掉了. 好吧, 这种危险的操作又做了一次.
不过没关系, 因为不是很重要的功能, 还好损失不大. 那么这个 MenuItem 方法呢, 要改成如下:
- public class PreviousFunctions : MonoBehaviour
- {
- #if UNITY_EDITOR
- [MenuItem("QFramework/3.MenuItem 复用",false,3)]
- private static void MenuClicked()
- {
- EditorUtil.CallMenuItem("QFramework/2. 复制文本到剪切板");
- }
- #endif
- }
代码很容易理解. 菜单名字改变了, 所以我们的文件夹和类名都要改变.
更改后的目录如下:
代码如下:
- #if UNITY_EDITOR
- using UnityEditor;
- #endif
- using UnityEngine;
- using System;
- using System.IO;
- namespace QFramework
- {
- public class EditorUtil
- {
- #if UNITY_EDITOR
- public static void CallMenuItem(string menuPath)
- {
- EditorApplication.ExecuteMenuItem(menuPath);
- }
- public static void OpenInFolder(string folderPath)
- {
- Application.OpenURL("file:///" + folderPath);
- }
- public static void ExportPackage(string assetPathName,string fileName)
- {
- AssetDatabase.ExportPackage(assetPathName, fileName, ExportPackageOptions.Recurse);
- }
- #endif
- }
- public class ReuseMenuItem : MonoBehaviour
- {
- #if UNITY_EDITOR
- [MenuItem("QFramework/3.MenuItem 复用",false, 3)]
- private static void MenuClicked()
- {
- EditorUtil.CallMenuItem("QFramework/2. 复制文本到剪切板");
- }
- #endif
- }
- }
我们发现其实还有一个类 EditorUtil, 刚好 ReuseMenuItem 是 EditorUtil 中 CallMenuItem 的使用代码.
所以可以进行合并, 合并之后代码如下:
- #if UNITY_EDITOR
- using UnityEditor;
- #endif
- using UnityEngine;
- namespace QFramework
- {
- public class EditorUtil
- {
- #if UNITY_EDITOR
- [MenuItem("QFramework/3.MenuItem 复用",false,3)]
- private static void MenuClicked()
- {
- CallMenuItem("QFramework/2. 复制文本到剪切板");
- }
- public static void CallMenuItem(string menuPath)
- {
- EditorApplication.ExecuteMenuItem(menuPath);
- }
- public static void OpenInFolder(string folderPath)
- {
- Application.OpenURL("file:///" + folderPath);
- }
- public static void ExportPackage(string assetPathName, string fileName)
- {
- AssetDatabase.ExportPackage(assetPathName, fileName, ExportPackageOptions.Recurse);
- }
- #endif
- }
- }
但是类的名字, 改变了, 而类所在的文件名还是 ReuseMenuItem, 这应该怎么办?
这是一个规则之间的互相制衡导致的冲突.
笔者的解决办法就是, 把代码名字改成 EditorUtil, 最起码类名和文件名一致了. 功能名和菜单名也一致了. 而 EditorUtil 总好过一个 CustomShortCut 或者 PreviousFunctions 这样的命名. 而为什么 EditorUtil 更好, 那么这个以后会专门讲, 现在呢, 我们就先这样做就好了.
文件名改完之后, 目录结构如下图所示.
这样完整的第八个示例, 就全部整理完了, 通过第八个示例整理出来了第三个示例. 删除了很多冗余代码, 很有成就感.
今天的内容就这些. 拜拜~
转载请注明地址: 凉鞋的笔记: http://liangxiegame.com/
更多内容
QFramework 地址: https://github.com/liangxiegame/QFramework
QQ 交流群: 623597263
Unity 进阶小班:
主要训练内容:
框架搭建训练 (第一年)
跟着案例学 Shader(第一年)
副业的孵化 (第二年, 第三年)
权益, 授课形式等具体详情请查看《小班产品手册》 https://liangxiegame.com/master/intro : https://liangxiegame.com/master/intro
关注公众号: liangxiegame 获取第一时间更新通知及更多的免费内容.
来源: https://www.cnblogs.com/liangxiegame/p/12684789.html