昨天我们完成了第八个示例的第二个 MenuItem 菜单顺序的调整。

我们今天再往下接着调整。

我们来看下接下来的 MenuItem

代码如下:

  1. [MenuItem("QFramework/8.总结之前的方法/3.生成文件名到剪切板")]
  2. private static void MenuClicked3()
  3. {
  4. CommonUtil.CopyText(Exporter.GenerateUnityPackageName());
  5. }

CommonUtil 已经提取成第二个示例了。

Exporter.GenerateUnityPackageName() 这个方法的定义在第八个示例 PreviousFunctions 类的上方。它属于专门为导出功能定制的代码,也就是在其他情况下不适用的。

而这个 MenuItem 本身呢,现在没有太大的用处。有用的部分是 Exporter.GenerateUnityPackageName 的方法定义和所在的类。

所以这个 MenuItem 就直接删除了。

删除之后,我们把 Exporter 这个类移动到第一个示例里,因为第一个示例是导出功能所在的地方,Exporter 类呢本身就是一个导出功能的一部分。

第一个示例原来的代码如下:

  1. using System.IO;
  2. #if UNITY_EDITOR
  3. using UnityEditor;
  4. #endif
  5. using UnityEngine;
  6. namespace QFramework
  7. {
  8. public class CustomShortCut : MonoBehaviour
  9. {
  10. #if UNITY_EDITOR
  11. [MenuItem("QFramework/1.导出 UnityPackage %e",false,1)]
  12. private static void MenuClicked()
  13. {
  14. var generatePackageName = Exporter.GenerateUnityPackageName();
  15. EditorUtil.ExportPackage("Assets/QFramework",generatePackageName + ".unitypackage");
  16. EditorUtil.OpenInFolder(Path.Combine(Application.dataPath, "../"));
  17. }
  18. #endif
  19. }
  20. }

移动 Exporter 类之后变成如下:

  1. using System;
  2. using System.IO;
  3. #if UNITY_EDITOR
  4. using UnityEditor;
  5. #endif
  6. using UnityEngine;
  7. namespace QFramework
  8. {
  9. public class Exporter
  10. {
  11. public static string GenerateUnityPackageName()
  12. {
  13. return "QFramework_" + DateTime.Now.ToString("yyyyMMdd_hh");
  14. }
  15. }
  16. public class CustomShortCut : MonoBehaviour
  17. {
  18. #if UNITY_EDITOR
  19. [MenuItem("QFramework/1.导出 UnityPackage %e",false,1)]
  20. private static void MenuClicked()
  21. {
  22. var generatePackageName = Exporter.GenerateUnityPackageName();
  23. EditorUtil.ExportPackage("Assets/QFramework",generatePackageName + ".unitypackage");
  24. EditorUtil.OpenInFolder(Path.Combine(Application.dataPath, "../"));
  25. }
  26. #endif
  27. }
  28. }

到这里,我们发现,Exporter 类可以和 CunstomShortCut 类进行合并,合并之后的类名是 Exporter,而代码的文件名改成了 Exporter.cs。

代码如下:

Exporter.cs

  1. using System;
  2. using System.IO;
  3. #if UNITY_EDITOR
  4. using UnityEditor;
  5. #endif
  6. using UnityEngine;
  7. namespace QFramework
  8. {
  9. public class Exporter
  10. {
  11. #if UNITY_EDITOR
  12. [MenuItem("QFramework/1.导出 UnityPackage %e",false,1)]
  13. private static void MenuClicked()
  14. {
  15. var generatePackageName = Exporter.GenerateUnityPackageName();
  16. EditorUtil.ExportPackage("Assets/QFramework",generatePackageName + ".unitypackage");
  17. EditorUtil.OpenInFolder(Path.Combine(Application.dataPath, "../"));
  18. }
  19. #endif
  20. public static string GenerateUnityPackageName()
  21. {
  22. return "QFramework_" + DateTime.Now.ToString("yyyyMMdd_hh");
  23. }
  24. }
  25. }

目录结构如下:

这样第八个示例的第三个 MenuItem 就整理完毕了。

小结

其实在整理第一个示例的时候,第一个示例的类的名字 CustomShortCut 就有很大的问题。我们第一个示例的功能是 导出 UnityPackage,类名却叫 自定义快捷键,这样比较奇怪。但是当时没有发现,因为只去关注菜单名是否和文件夹名是否一致了,没有考虑类名是否合理。

所以呢,我们的规范和约定要加入上一个条例:

  1. 要给类/代码文件取合适的命名。

加上之后如下:

约定和规则:

  • 每个示例在 QFramework 目录下创建一个文件夹,文件夹的格式是: 数字.示例的功能

    • 每个示例写一个脚本,脚本中包含可复用的静态方法和 MenuItem 方法。
    • 每写一个示例进行一次导出,导出的文件名后边加上日期和时间,这个功能已经在导出功能里内置了。
    • 每次有 API 变更的时候做一次备份,备份的名字采用 QFramework_vX.Y.Z 格式。
    • 每次进行整理的时候要确保是在功能有效的情况下进行删除和变更。
    • 确保菜单名和文件夹名一致(新增)
    • 要给类/代码文件取合适的命名(新增)
    • 在删除弃用代码的步骤:
      1. 消除弃用警告。
      2. 搜索弃用方法的引用,并逐个升级为最新的方法。
      3. 全局搜索方法名,并根据情况逐个升级为新的方法。

在上面 我们通过第八个示例的第三个 MenuItem 方法,我们更新了约定和规则。

我们接着往下整理。

第八个示例的第四个 MenuItem 方法

  1. [MenuItem("QFramework/8.总结之前的方法/4.导出 UnityPackage")]
  2. private static void MenuClicked4()
  3. {
  4. EditorUtil.ExportPackage("Assets/QFramework",Exporter.GenerateUnityPackageName() + ".unitypackage");
  5. }

这个 MenuItem 可以删除了,因为功能已经在第一个示例实现过了。

第八个示例的第五个 MenuItem 方法

  1. [MenuItem("QFramework/8.总结之前的方法/5.打开所在文件夹")]
  2. private static void MenuClicked5()
  3. {
  4. EditorUtil.OpenInFolder(Application.dataPath);
  5. }

同样也删除了。

第八个示例的第六个 MenuItem 方法

  1. [MenuItem("QFramework/8.总结之前的方法/6.MenuItem 复用")]
  2. private static void MenuClicked6()
  3. {
  4. EditorUtil.CallMenuItem("QFramework/8.总结之前的方法/4.导出 UnityPackage");
  5. EditorUtil.OpenInFolder(Path.Combine(Application.dataPath, "../"));
  6. }

这个不能马上删除,因为这是 EditorUtil.CallMenuItem 仅有的一个调用的地方。

所以要留着,但是这个功能其实已经失效了,因为 "QFramework/8.总结之前的方法/4.导出 UnityPackage" 这个 MenuItem 被我们刚才删掉了。好吧,这种危险的操作又做了一次。

不过没关系,因为不是很重要的功能,还好损失不大。那么这个 MenuItem 方法呢,要改成如下:

  1. public class PreviousFunctions : MonoBehaviour
  2. {
  3. #if UNITY_EDITOR
  4. [MenuItem("QFramework/3.MenuItem 复用",false,3)]
  5. private static void MenuClicked()
  6. {
  7. EditorUtil.CallMenuItem("QFramework/2.复制文本到剪切板");
  8. }
  9. #endif
  10. }

代码很容易理解。菜单名字改变了,所以我们的文件夹和类名都要改变。

更改后的目录如下:

代码如下:

  1. #if UNITY_EDITOR
  2. using UnityEditor;
  3. #endif
  4. using UnityEngine;
  5. using System;
  6. using System.IO;
  7. namespace QFramework
  8. {
  9. public class EditorUtil
  10. {
  11. #if UNITY_EDITOR
  12. public static void CallMenuItem(string menuPath)
  13. {
  14. EditorApplication.ExecuteMenuItem(menuPath);
  15. }
  16. public static void OpenInFolder(string folderPath)
  17. {
  18. Application.OpenURL("file:///" + folderPath);
  19. }
  20. public static void ExportPackage(string assetPathName,string fileName)
  21. {
  22. AssetDatabase.ExportPackage(assetPathName, fileName, ExportPackageOptions.Recurse);
  23. }
  24. #endif
  25. }
  26. public class ReuseMenuItem : MonoBehaviour
  27. {
  28. #if UNITY_EDITOR
  29. [MenuItem("QFramework/3.MenuItem 复用",false, 3)]
  30. private static void MenuClicked()
  31. {
  32. EditorUtil.CallMenuItem("QFramework/2.复制文本到剪切板");
  33. }
  34. #endif
  35. }
  36. }

我们发现其实还有一个类 EditorUtil,刚好 ReuseMenuItem 是 EditorUtil 中 CallMenuItem 的使用代码。

所以可以进行合并,合并之后代码如下:

  1. #if UNITY_EDITOR
  2. using UnityEditor;
  3. #endif
  4. using UnityEngine;
  5. namespace QFramework
  6. {
  7. public class EditorUtil
  8. {
  9. #if UNITY_EDITOR
  10. [MenuItem("QFramework/3.MenuItem 复用",false,3)]
  11. private static void MenuClicked()
  12. {
  13. CallMenuItem("QFramework/2.复制文本到剪切板");
  14. }
  15. public static void CallMenuItem(string menuPath)
  16. {
  17. EditorApplication.ExecuteMenuItem(menuPath);
  18. }
  19. public static void OpenInFolder(string folderPath)
  20. {
  21. Application.OpenURL("file:///" + folderPath);
  22. }
  23. public static void ExportPackage(string assetPathName, string fileName)
  24. {
  25. AssetDatabase.ExportPackage(assetPathName, fileName, ExportPackageOptions.Recurse);
  26. }
  27. #endif
  28. }
  29. }

但是类的名字,改变了,而类所在的文件名还是 ReuseMenuItem,这应该怎么办?

这是一个规则之间的互相制衡导致的冲突。

笔者的解决办法就是,把代码名字改成 EditorUtil,最起码类名和文件名一致了。功能名和菜单名也一致了。而 EditorUtil 总好过一个 CustomShortCut 或者 PreviousFunctions 这样的命名。而为什么 EditorUtil 更好,那么这个以后会专门讲,现在呢,我们就先这样做就好了。

文件名改完之后,目录结构如下图所示.

这样完整的第八个示例,就全部整理完了,通过第八个示例整理出来了第三个示例。删除了很多冗余代码,很有成就感。

今天的内容就这些。拜拜~

转载请注明地址:凉鞋的笔记:liangxiegame.com

更多内容

Unity 游戏框架搭建 2019 (三十二、三十三) 类的命名 & 代码文件命名的更多相关文章

  1. Unity 游戏框架搭建 2019 (九~十二) 第一章小结&第二章简介&第八个示例

    第一章小结 为了强化教程的重点,会在合适的时候进行总结与快速复习. 第二章 简介 在第一章我们做了知识库的准备,从而让我们更高效地收集示例. 在第二章,我们就用准备好的导出工具试着收集几个示例,这些示 ...

  2. Unity 游戏框架搭建 2019 (四十二、四十三) MonoBehaviour 简化 & 定时功能

    MonoBehaviour 简化 在前两篇,我们完成了第九个示例.为了完善第九个示例,我们复习了类的继承,又学习了泛型和 params 关键字. 我们已经接触了类的继承了.接触继承之前,把类仅仅当做是 ...

  3. Unity 游戏框架搭建 2019 (五十二~五十四) 什么是库?&第四章总结&第五章简介

    在上一篇,我们对框架和架构进行了一点探讨.我们在这一篇再接着探讨. 什么是库呢? 来自同一位大神的解释: 库, 插到 既有 架构 中, 补充 特定 功能. 很形象,库就是搞这个的.我们的库最初存在的目 ...

  4. Unity 游戏框架搭建 2019 (四十六) 简易消息机制 & 集成到 MonoBehaviourSimplify 里

    在上一篇,我们接触了单例,使用单例解决了我们脚本之间访问的问题. 脚本之间访问其实有更好的方式. 我们先分下脚本访问脚本的几种形式. 第一种,A GameObject 是 B GameObject 的 ...

  5. Unity 游戏框架搭建 2019 (四十八/四十九) MonoBehaviourSimplify 中的消息策略完善&关于发送事件的简单封装

    MonoBehaviourSimplify 中的消息策略完善 在上一篇,笔者说,MonoBehaviourSimplify 中的消息策略还有一些小问题.我们在这篇试着解决一下. 先贴出来代码: usi ...

  6. Unity 游戏框架搭建 2019 (五十、五十一) 消息机制小结&MonoBehaviourSimplify 是框架?

    我们花了 5 篇文章学习了消息机制的方方面面.并且完成了一个简易消息机制,之后集成到了我们的 MonoBehaviourSimplify 里. 现在 MonoBehaviourSimplify 有一点 ...

  7. Unity 游戏框架搭建 2019 (五十六/五十七) 需求分析-架构中最重要的一环&从 EmptyGO 到 Manager Of Managers

    我们的项目开始立项的时候,最常见的一个情况就是:几个人的小团队,一开始什么也不做,就开始写代码,验证逻辑,游戏就开始写起来了.而公司的一些所谓的领导层面一开始就把游戏定义为我们要做一个大作.这个事情本 ...

  8. Unity 游戏框架搭建 2019 (四十四、四十五) 关于知识库的小结&独立的方法和独立的类

    在上一篇,我们完成了一个定时功能,并且接触了 Action 和委托.lambda 表达式这些概念. 到目前为止,我们的库作为知识收录这个功能来说,已经非常好用了,由于使用了 partial 关键字,所 ...

  9. Unity 游戏框架搭建 2019 (二十一、二十二) 第三章简介&整理前的准备

    整理前的准备 到目前为止,我们积攒了很多示例了,并且每个示例也都贯彻了最的约定和规则. 在上一篇的小结也说了一个比较新的东西:编程体验优化. 在之前我们还积攒了一个问题:代码重复问题. 我们可是忍住整 ...

随机推荐

  1. 使用sklearn做单机特征工程(Performing Feature Engineering Using sklearn)

    本文转载自使用sklearn做单机特征工程 目录 目录 特征工程是什么 数据预处理 1 无量纲化 11 标准化 12 区间缩放法 13 标准化与归一化的区别 2 对定量特征二值化 3 对定性特征哑编码 ...

  2. python之目录

    一.python基础 ​ python之字符串str操作方法 ​ python之int (整型) ​ python之bool (布尔值) ​ python之str (字符型) ​ python之ran ...

  3. 1+1>2:MIT&IBM提出结合符号主义和连接主义的高效、准确新模型

    自人工智能的概念提出以来,关于符号主义和连接主义的争论就不绝于耳.究竟哪一种方式可以实现更好的人工智能?这一问题目前还没有定论.深度学习的快速发展让我们看到连接主义在构建 AI 系统中的优势,但其劣势 ...

  4. React源码解析——ReactAPI

    一.API背景 api的具体转化关系 可以通过到https://babeljs.io/repl/网站去将我们创建的Jsx进行实时的转译 const React = { Children: { map, ...

  5. 以个人身份加入.NET基金会

    .NET 走向开源,MIT许可协议. 微软为了推动.NET开源社区的发展,2014年联合社区成立了.NET基金会. 一年前 .NET 基金会完成第一次全面改选,2014年 .NET基金会的创始成员中有 ...

  6. java程序:转化金额

    在处理财务账款时,需要将转账金额写成大写的.也就是说,如果要转账123456.00元,则需要写成“壹拾贰万叁仟肆佰伍拾陆元整”.所以常常需要通过程序控制自动进行转换.本实例实现了小写金额到大写金额的转 ...

  7. c#的全局异常捕获

    以下操作在Program.cs中 1.最简单的方式try...catch.. 一般用在某一段容易出错的代码,如果用在整个软件排查,如下所示 static void Main() { try { App ...

  8. JLabel有点感觉了,码上

    Java中Label的姿势 Jabel与JDialog窗口的是否可见可做为弹窗. 设置字体颜色 jl.setForeground(Color.ORANGE);//设置字体颜色 设置字体与大小 jl.s ...

  9. python学习要点(二)

    我的博客:https://www.luozhiyun.com/archives/269 '==' VS 'is' '=='操作符比较对象之间的值是否相等. 'is'操作符比较的是对象的身份标识是否相等 ...

  10. Hadoop(五):HDFS的JAVA API基本操作

    HDFS的JAVA API操作 HDFS在生产应用中主要是客户端的开发,其核心步骤是从HDFS提供的api中构造一个HDFS的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS上的文件. 主 ...