在上一篇我们整理到了第七个示例, 我们今天再接着往下整理. 我们来看第八个示例:
- #if UNITY_EDITOR
- using UnityEditor;
- #endif
- using UnityEngine;
- using System;
- using System.IO;
- namespace QFramework
- {
- public class PreviousFunctions : MonoBehaviour
- {
- public static string GenerateUnityPackageName()
- {
- return "QFramework_" + DateTime.Now.ToString("yyyyMMdd_hh");
- }
- public static void CopyText(string text)
- {
- GUIUtility.systemCopyBuffer = text;
- }
- public static void OpenInFolder(string folderPath)
- {
- Application.OpenURL("file:///" + folderPath);
- }
- #if UNITY_EDITOR
- public static void CallMenuItem(string menuPath)
- {
- EditorApplication.ExecuteMenuItem(menuPath);
- }
- public static void ExportPackage(string assetPathName,string fileName)
- {
- AssetDatabase.ExportPackage(assetPathName, fileName, ExportPackageOptions.Recurse);
- }
- #endif
- #if UNITY_EDITOR
- [MenuItem("QFramework/8. 总结之前的方法 / 1. 获取文件名")]
- private static void MenuClicked()
- {
- Debug.Log(GenerateUnityPackageName());
- }
- [MenuItem("QFramework/8. 总结之前的方法 / 2. 复制文本到剪切板")]
- private static void MenuClicked2()
- {
- CopyText("要复制的关键字");
- }
- [MenuItem("QFramework/8. 总结之前的方法 / 3. 生成文件名到剪切板")]
- private static void MenuClicked3()
- {
- CopyText(GenerateUnityPackageName());
- }
- [MenuItem("QFramework/8. 总结之前的方法 / 4. 导出 UnityPackage")]
- private static void MenuClicked4()
- {
- ExportPackage("Assets/QFramework",GenerateUnityPackageName() + ".unitypackage");
- }
- [MenuItem("QFramework/8. 总结之前的方法 / 5. 打开所在文件夹")]
- private static void MenuClicked5()
- {
- OpenInFolder(Application.dataPath);
- }
- [MenuItem("QFramework/8. 总结之前的方法 / 6.MenuItem 复用")]
- private static void MenuClicked6()
- {
- CallMenuItem("QFramework/8. 总结之前的方法 / 4. 导出 UnityPackage");
- OpenInFolder(Path.Combine(Application.dataPath, "../"));
- }
- [MenuItem("QFramework/8. 总结之前的方法 / 7. 自定义快捷键")]
- private static void MenuClicked7()
- {
- Debug.Log("%e 意思是快捷键 cmd/ctrl + e");
- }
- #endif
- }
- }
其实代码量还是比较多的.
而在上一篇中, 我们就知道了, 这个示例有类命名的问题. 我们运气比较好, 刚好可以试着解决一下.
关于类, 我们在写第一个示例的时候就去接触了, 不过笔者并没有讲它, 是因为作为一个代码设计的工具, 类是非常重要的一个概念, 它比方法复杂得多, 不过今天我们不用全部了解, 只需要了解对本示例有用的部分就好了.
我们都知道, 在 C# 中方法都是需要在类中实现的. 所以类的第一个作用就是方法的集合.
而我们的问题是, 对于 OpenInFinder ,ExportPackage 这些方法所在的类的名字比较奇怪.
之所以能意识到问题的存在, 是因为笔者知道一个库不可能仅仅这几个方法的. 如果是仅仅这几个方法, 我们还是可以叫 PreviousFunctions . 因为方法数量比较小, 所以用人脑就可以记住了. 就算忘记了再去看一遍也很容易记住的. 但是到目前为止我们收集了 13 个示例, 那么至少有 13 个方法, 在未来随着时间增长, 我们要收集的方法会越来越多. 所以给方法进行合理地分类, 并把它们放在合适的地方是必须要做的.
不过我们对于对方法分类还是新手, 因为到目前为止, 笔者没有在此专栏中提过方法分类这件事,
我们先来看下这些方法是干嘛的, 以及用在哪里的?
GenerateUnityPackageName: 自动生成文件名, 是属于导出功能的一部分, 属于定制方法.
CopyText: 复制文本, 比较通用.
OpenInFolder: 打开所在文件夹, 在 UnityEditor 里比较通用.
CallMenuItem: 复用菜单, 在 UnityEditor 里比较通用.
ExportPackage: 导出 Package, 在 UnityEditor 比较通用.
很自然地, 根据用处可以分为三类, 一个是定制方法, GenerateUnityPackageName, 它只能用在导出功能里. 在其他的情况下很少适用.
第二种则是 UnityEditor 通用, 比如 OpenInFolder 和 CallMenuItem.
第三种则是可能全平台通用的, 比如 CopyText.
基于以上我们就按照这种方式去分类. 如何分呢?
答案就是使用类, 给类起一个类型名字就好.
在之前我们提过, 类的第一个作用是方法的集合, 它可以放若干个方法. 而我们方法已经分好类型了, 现在就差给类起一个合适的名字. 我们先叫做 Exporter (导出器) ,EditorUtil (编辑器工具) 和 CommonUtil (通用工具).
代码如下:
CommonUtil 类
- public class CommonUtil
- {
- public static void CopyText(string text)
- {
- GUIUtility.systemCopyBuffer = text;
- }
- }
Exporter 类
- public class Exporter
- {
- public static string GenerateUnityPackageName()
- {
- return "QFramework_" + DateTime.Now.ToString("yyyyMMdd_hh");
- }
- }
EditorUtil 类
- 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
- }
这样就算给方法分好类了, 这三个类放在了 PreviousFunctions 类定义位置的上方.
如下代码所示:
- #if UNITY_EDITOR
- using UnityEditor;
- #endif
- using UnityEngine;
- using System;
- using System.IO;
- namespace QFramework
- {
- public class CommonUtil
- {
- ...
- }
- public class Exporter
- {
- ...
- }
- public class EditorUtil
- {
- ...
- }
- public class PreviousFunctions : MonoBehaviour
- {
- ...
- }
- }
那么, PreviousFunctions 里以前实现的方法怎么办? 要进行删除嘛?
已经删了的童鞋可能知道, 直接删除会造成编译问题. 因为在第七个示例里, 已经用了 PreviousFunctions 里的方法. 所以保险起见, 不能马上进行删除, 而是做一步方法的中转.
例如 PreviousFunction.CopyText 实现如下所示:
- public static void CopyText(string text)
- {
- CommonUtil.CopyText(text);
- }
这样就可以了, ok 了, 我们把其他的部分也照着这样做, 代码如下.
- public static string GenerateUnityPackageName()
- {
- return Exporter.GenerateUnityPackageName();
- }
- public static void CopyText(string text)
- {
- CommonUtil.CopyText(text);
- }
- public static void OpenInFolder(string folderPath)
- {
- EditorUtil.OpenInFolder((folderPath));
- }
- #if UNITY_EDITOR
- public static void CallMenuItem(string menuPath)
- {
- EditorUtil.CallMenuItem(menuPath);
- }
- public static void ExportPackage(string assetPathName,string fileName)
- {
- EditorUtil.ExportPackage(assetPathName, fileName);
- }
- #endif
这样, 可以保证功能不失效, 也就是遵循了我们的约定和规则之一.
但是这样还不够, 因为我们逐个整理完示例之后, 回过头来可能会忘记. 在这里笔者介绍一个 C# 的标签属性 [System.Obselete("方法以过时")] , 只要在方法上加上这个标签, 编译器就会在使用这个方法的地方报出警告, 而警告的内容则是 Obselete 括号中的 "方法以过时".
我们先给这五个方法加上, 然后观察下 Unity 的控制台的警告.
代码如下:
PreviousFunctions.cs
- [Obsolete("方法以过时, 请使用 Exporter.GenerateUnityPackageName();")]
- public static string GenerateUnityPackageName()
- {
- return Exporter.GenerateUnityPackageName();
- }
- [Obsolete("方法以过时, 请使用 CommonUtil.CopyText(text);")]
- public static void CopyText(string text)
- {
- CommonUtil.CopyText(text);
- }
- [Obsolete("方法以过时, 请使用 EditorUtil.OpenInFolder(folderPath);")]
- public static void OpenInFolder(string folderPath)
- {
- EditorUtil.OpenInFolder(folderPath);
- }
- #if UNITY_EDITOR
- [Obsolete("方法以过时, 请使用 EditorUtil.CallMenuItem(menuPath);")]
- public static void CallMenuItem(string menuPath)
- {
- EditorUtil.CallMenuItem(menuPath);
- }
- [Obsolete("方法以过时, 请使用 EditorUtil.ExportPackage(assetPathName, fileName);"]
- public static void ExportPackage(string assetPathName,string fileName)
- {
- EditorUtil.ExportPackage(assetPathName, fileName);
- }
- #endif
编译之后的结果如下:
信息给得非常详细, 这样我们之后就不会忘记了, 只要在方法上有 Obsolete 的方法, 在进行整理的时候如果它没有被引用的时候就可以删掉了.
现在这几个方法被第七个示例引用了, 所以还不能删除, 而是这一轮示例整理过后, 回过头再整理.
今天新的内容够多了, 我们直接列出完整的 PreviousFuctions.cs 代码.
如下:
- #if UNITY_EDITOR
- using UnityEditor;
- #endif
- using UnityEngine;
- using System;
- using System.IO;
- namespace QFramework
- {
- public class CommonUtil
- {
- public static void CopyText(string text)
- {
- GUIUtility.systemCopyBuffer = text;
- }
- }
- public class Exporter
- {
- public static string GenerateUnityPackageName()
- {
- return "QFramework_" + DateTime.Now.ToString("yyyyMMdd_hh");
- }
- }
- 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 PreviousFunctions : MonoBehaviour
- {
- [Obsolete("方法以过时, 请使用 Exporter.GenerateUnityPackageName();")]
- public static string GenerateUnityPackageName()
- {
- return Exporter.GenerateUnityPackageName();
- }
- [Obsolete("方法以过时, 请使用 CommonUtil.CopyText(text);")]
- public static void CopyText(string text)
- {
- CommonUtil.CopyText(text);
- }
- [Obsolete("方法以过时, 请使用 EditorUtil.OpenInFolder(folderPath);")]
- public static void OpenInFolder(string folderPath)
- {
- EditorUtil.OpenInFolder(folderPath);
- }
- #if UNITY_EDITOR
- [Obsolete("方法以过时, 请使用 EditorUtil.CallMenuItem(menuPath);")]
- public static void CallMenuItem(string menuPath)
- {
- EditorUtil.CallMenuItem(menuPath);
- }
- [Obsolete("方法以过时, 请使用 EditorUtil.ExportPackage(assetPathName, fileName);")]
- public static void ExportPackage(string assetPathName,string fileName)
- {
- EditorUtil.ExportPackage(assetPathName, fileName);
- }
- #endif
- #if UNITY_EDITOR
- [MenuItem("QFramework/8. 总结之前的方法 / 1. 获取文件名")]
- private static void MenuClicked()
- {
- Debug.Log(Exporter.GenerateUnityPackageName());
- }
- [MenuItem("QFramework/8. 总结之前的方法 / 2. 复制文本到剪切板")]
- private static void MenuClicked2()
- {
- CommonUtil.CopyText("要复制的关键字");
- }
- [MenuItem("QFramework/8. 总结之前的方法 / 3. 生成文件名到剪切板")]
- private static void MenuClicked3()
- {
- CommonUtil.CopyText(GenerateUnityPackageName());
- }
- [MenuItem("QFramework/8. 总结之前的方法 / 4. 导出 UnityPackage")]
- private static void MenuClicked4()
- {
- EditorUtil.ExportPackage("Assets/QFramework",GenerateUnityPackageName() + ".unitypackage");
- }
- [MenuItem("QFramework/8. 总结之前的方法 / 5. 打开所在文件夹")]
- private static void MenuClicked5()
- {
- EditorUtil.OpenInFolder(Application.dataPath);
- }
- [MenuItem("QFramework/8. 总结之前的方法 / 6.MenuItem 复用")]
- private static void MenuClicked6()
- {
- EditorUtil.CallMenuItem("QFramework/8. 总结之前的方法 / 4. 导出 UnityPackage");
- EditorUtil.OpenInFolder(Path.Combine(Application.dataPath, "../"));
- }
- #endif
- }
- }
大家发现 PreviousFunctions 这个类里的所有的 MenuItem 方法里的实现, 都改成了新的方法.
而笔者删除了以下方法, 原因是知识点和第七个示例重复了, 有了第七个示例就不需要这个方法了.
- [MenuItem("QFramework/8. 总结之前的方法 / 7. 自定义快捷键")]
- private static void MenuClicked7()
- {
- Debug.Log("%e 意思是快捷键 cmd/ctrl + e");
- }
小结
要做的事情:
(完成) 备份: 导出文件, 并取一个合理的名字.
遗留问题:
(完成一部分) 第八个示例与之前的示例代码重复, 功能重复.
(完成) 方法所在类的命名有问题.
菜单栏显示顺序问题.
约定和规则:
每个示例在 QFramework 目录下创建一个文件夹, 文件夹的格式是: 数字. 示例的功能
每个示例写一个脚本, 脚本中包含可复用的静态方法和 MenuItem 方法.
每写一个示例进行一次导出, 导出的文件名后边加上日期和时间, 这个功能已经在导出功能里内置了.
每次有 API 变更的时候做一次备份, 备份的名字采用 QFramework_vX.Y.Z 格式.
每次进行整理的时候要确保是在功能有效的情况下进行删除和变更.
示例分类:
知识学习 & 收集
API 收集
C# 语法实践
库本身的功能
规则实现
使用流程提供及优化
效率提升 (编码体验, 逻辑复用)
项目实用工具收集
今天的内容就写到这里, 下一篇再见, 拜拜~
转载请注明地址: 凉鞋的笔记: 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/12671758.html