昨天我们完成了第八个示例的第二个 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,类名却叫 自定义快捷键,这样比较奇怪。但是当时没有发现,因为只去关注菜单名是否和文件夹名是否一致了,没有考虑类名是否合理。

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

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

加上之后如下:

约定和规则:

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

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

在上面 我们通过第八个示例的第三个 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 更好,那么这个以后会专门讲,现在呢,我们就先这样做就好了。

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

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

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

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

更多内容

最新文章

  1. Web前端开发高手进阶
  2. 【SCOI2005】 最大子矩阵 BZOJ 1084
  3. libev学习(一)
  4. shell编程之运算符
  5. SNMP常用数据操作
  6. java编程eclipse常用快捷键方式
  7. linux下mysql安装、目录结构、配置
  8. zabbix用自带模板监控mysql
  9. php下载c
  10. SSDB
  11. 查看ORACLE执行计划的几种常用方法
  12. Model
  13. 写一个Windows上的守护进程(8)获取进程路径
  14. openstack windows 2008 img
  15. cocos2dx进阶学习之CCApplication
  16. 读书笔记 effective c++ Item 53 关注编译器发出的警告
  17. 关于*.ashx 处理程序调试时 未能创建类型 错误
  18. 好用的UI框架收集
  19. iOS中 H5的input输入框focus()无法自动拉起键盘(解决方法)
  20. js脚本实现自动上传至github

热门文章

  1. 强化学习之一:从TensorFlow开始(Start from TensorFlow)
  2. 一个完整的机器学习项目在Python中演练(四)
  3. Colab笔记本能用英伟达Tesla T4了,谷歌的羊毛薅到酸爽
  4. LLVM 编码规范 - 中文翻译
  5. 用c#判断回文数和降序数
  6. 面试中常问的五种IO模型和BIO,NIO,AIO
  7. Python学习-第五节:面向对象
  8. pycharm文件名颜色代表的含义
  9. 01 微信小程序创建组件和使用组件
  10. django rest framework用户认证