今天开始,进行逐个示例的整理。
第一个示例
先看第一个。
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
using System;
namespace QFramework
{
public static class LogFileName
{
#if UNITY_EDITOR
[MenuItem("QFramework/1.生成 unitypackage 名字")]
#endif
private static void GenerateUnityPackageName()
{
Debug.Log("QFramework_" + DateTime.Now.ToString("yyyyMMdd_hh"));
}
}
}
因为在第八个示例里给提取成方法了,所以这个示例可以直接删除了。
删除之后的文件结构如下图所示。
第二个示例
代码如下
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
namespace QFramework
{
public static class CopyText2Clipboard
{
#if UNITY_EDITOR
[MenuItem("QFramework/2.复制文本到剪切板")]
#endif
private static void CopyText()
{
GUIUtility.systemCopyBuffer = "要复制的关键字";
}
}
}
这个也在第八个示例中提取成方法了,所以这部分也可以直接删了,
删除之后的文件结构如下图所示:
第三个示例
代码如下:
using System;
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
namespace QFramework
{
public class GenerateUnityPackageName2ClipBoard
{
#if UNITY_EDITOR
[MenuItem("QFramework/3.生成文件名到剪切板")]
#endif
private static void MenuClicked()
{
GUIUtility.systemCopyBuffer = "QFramework_" + DateTime.Now.ToString("yyyyMMdd_hh");
}
}
}
这个示例是是原来示例一和示例二的结合,同样在第八个示例中提取成方法了,果断删。
第四个示例
using System;
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
namespace QFramework
{
public class ExportUnityPackage : MonoBehaviour
{
#if UNITY_EDITOR
[MenuItem("QFramework/4.导出 UnityPackage")]
private static void MenuClicked()
{
var assetPathName = "Assets/QFramework";
var fileName = "QFramework_" + DateTime.Now.ToString("yyyyMMdd_hh") + ".unitypackage";
AssetDatabase.ExportPackage(assetPathName, fileName, ExportPackageOptions.Recurse);
}
#endif
}
}
同理,果断删。
第五个示例
using System;
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
namespace QFramework
{
public class OpenInFolder
{
#if UNITY_EDITOR
[MenuItem("QFramework/5.打开所在文件夹")]
private static void MenuClicked()
{
Application.OpenURL("file:///" + Application.dataPath);
}
#endif
}
}
同理,果断删。
第六个示例
using System.IO;
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
namespace QFramework
{
public class ReuseMenuItem : MonoBehaviour
{
#if UNITY_EDITOR
[MenuItem("QFramework/6.MenuItem 复用")]
private static void MenuClicked()
{
EditorApplication.ExecuteMenuItem("QFramework/4.导出 UnityPackage");
Application.OpenURL("file:///" + Path.Combine(Application.dataPath, "../"));
}
#endif
}
}
同理果断删
第七个示例
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
namespace QFramework
{
public class CustomShortCut : MonoBehaviour
{
#if UNITY_EDITOR
[MenuItem("QFramework/7.自定义快捷键 %e")]
private static void MenuClicked()
{
EditorApplication.ExecuteMenuItem("QFramework/6.MenuItem 复用");
}
#endif
}
}
第七个示例是快捷键功能,不过我们没有在第八个示例中提取成方法,因为快捷键不可以复用。
而这个是我们目前导出功能的核心代码,所以比较重要,这个就不能删除了。
通过观察可知,MenuClicked 方法中的对 MenuItem "QFramework/6.MenuItem 复用" 的复用,已经失效了,因为第六个示例被我们删掉了。
不过没关系,我们在第八个示例中有提取成方法。而使用方法完成导出功能的代码如下:
[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");
}
不过在写第八个示例的时候还是在用 MenuItem 进行方法的调用,虽然那时候已经学习了调用 public 方法,但是由于 public 方法的运用没有那么纯熟,想不到是很正常的。但是现在不一样了,我们用 public 方法进行非常多的方法设计练习了,所以直接着手整理就好了。
整理后的第七个示例代码如下:
using System.IO;
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
namespace QFramework
{
public class CustomShortCut : MonoBehaviour
{
#if UNITY_EDITOR
[MenuItem("QFramework/7.自定义快捷键 %e")]
private static void MenuClicked()
{
var generatePackageName = PreviousFunctions.GenerateUnityPackageName();
PreviousFunctions.ExportPackage("Assets/QFramework",generatePackageName + ".unitypackage");
PreviousFunctions.OpenInFolder(Path.Combine(Application.dataPath, "../"));
}
#endif
}
}
这些方法都是自己实现的,调用起来比较亲切了吧?
等待编译之后,再按下快捷键 ctrl/cmd + e,就自动导出成功了,感受到满满的成就感。
不过命名方式还是 QFramework_日期_时,不过没关系,这不算真正的导出,只是测试而已,我们还没有整理结束。整理这个阶段虽然在文章中要写很久,但是实际过程中可能几分钟就整理完了。但是整理这个过程写文章很久的原因是,因为在整理的候笔者的内心戏份非常多,也就是思考经过会非常多。而笔者呢都要把它们展示出来,这样大家理解了这些,就不难自己再造个 QFramework 了甚至更好,而本系列专栏的亮点就是这个。
到此呢,我们成功了。
不过以上代码呢,还存在一些问题:
- 方法所在的类名比较奇怪,比如 GenerateUnityPackageName 和 ExportPackage 所在的类都是 PreviousFunctions,PreviousFunctions 意思是之前的方法。是为了配合示例的名字而起的。
- 菜单栏的显示顺序问题,目前菜单栏的显示顺序有点混乱,如下。
这个问题存在了好久了,不过没办法,因为一到七个示例已经写好了,当时没办法更改,在整理阶段是改掉这个问题的比较好的时机。
因为在本篇文章的开头,有说过我们一个一个示例进行整理,所以这两个问题,我们先记录下来,等每个示例都整理了一遍之后,再看看如何解决。
除了以上存在的这两个问题,我们还做了一个比较危险的操作,就是先删除了第六个示例,等到第七个示例的时候发现功能失效了,还好在第八个示例中我们有相同的功能实现,否则就要去靠记忆力去恢复功能了,或者靠我们 v0.0.0 版本的备份进行恢复。这样会耗费我们额外的精力和时间,是很不值当的。
基于这个经验,我们在整理代码的时候,要优先确保功能是有效的,然后再进行一些变更或者删除的操作。
小结
把以上两个问题记录下来,我们的总结又可以更新了,更新后如下。
- 要做的事情:
- (完成) 备份:导出文件,并取一个合理的名字。
- 遗留问题:
- (完成一部分) 第八个示例与之前的示例代码重复,功能重复。
- 方法所在类的命名有问题。
- 菜单栏显示顺序问题。
- 约定和规则:
- 每个示例在 QFramework 目录下创建一个文件夹,文件夹的格式是: 数字.示例的功能
- 每个示例写一个脚本,脚本中包含可复用的静态方法和 MenuItem 方法。
- 每写一个示例进行一次导出,导出的文件名后边加上日期和时间,这个功能已经在导出功能里内置了。
- 每次有 API 变更的时候做一次备份,备份的名字采用 QFramework_vX.Y.Z 格式。
- 每次进行整理的时候要确保是在功能有效的情况下进行删除和变更。
- 示例分类:
- 知识学习&收集
- API 收集
- C# 语法实践
- 库本身的功能
- 规则实现
- 使用流程提供及优化
- 效率提升(编码体验、逻辑复用)
- 项目实用工具收集
- 知识学习&收集
除了更新了两个问题以外,又在约定和规则中增加了关于备份的规则,描述得很清楚了,这里不多说了。
今天的内容就这些,拜拜~
转载请注明地址:凉鞋的笔记:liangxiegame.com
更多内容
QFramework 地址:https://github.com/liangxiegame/QFramework
QQ 交流群:623597263
-
Unity 进阶小班:
- 主要训练内容:
- 框架搭建训练(第一年)
- 跟着案例学 Shader(第一年)
- 副业的孵化(第二年、第三年)
- 权益、授课形式等具体详情请查看《小班产品手册》:https://liangxiegame.com/master/intro
- 主要训练内容:
-
关注公众号:liangxiegame 获取第一时间更新通知及更多的免费内容。