在上一篇我们抽取了第一个示例的方法,我们在这篇在接着往下抽取。
提取第二个示例
先看第二个示例的代码。
#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 = "要复制的关键字";
}
}
}
核心 API 是 GUIUtility.systemCopyBuffer,而后边的内容,应该是使用的时候自己填的。所以要创建一个 string 类型的参数,用来接收要复制的内容。抽取后的方法如下。
#if UNITY_EDITOR
[MenuItem("QFramework/8.总结之前的方法/2.复制文本到剪切板")]
#endif
private static void MenuClicked2()
{
CopyText("要复制的关键字");
}
public static void CopyText(string text)
{
GUIUtility.systemCopyBuffer = text;
}
提取第三示例
我们接着看第三个示例
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");
}
}
}
第三个示例和第一个和第二个示例重复了所以没有抽取的必要。不过,我们还是要实现与第三个 MenuItem 同等的功能的。
代码如下:
#if UNITY_EDITOR
[MenuItem("QFramework/8.总结之前的方法/3.生成文件名到剪切板")]
#endif
private static void MenuClicked3()
{
CopyText(GenerateUnityPackageName());
}
提取第四示例
第四个示例代码如下:
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
}
}
核心是 AssetDatabase.ExportPackage 这个 API。一般情况下 ExportPackageOptions 都是用 Recurse。所以只声明两个参数就好了。一个是 assetPathNam,一个是 fileName。抽取后的方法如下。
#if UNITY_EDITOR
[MenuItem("QFramework/8.总结之前的方法/4.导出 UnityPackage")]
private static void MenuClicked4()
{
ExportPackage("Assets/QFramework",GenerateUnityPackageName() + ".unitypackage");
}
#endif
public static void ExportPackage(string assetPathName,string fileName)
{
#if UNITY_EDITOR
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
}
}
核心的 API 就是 OpenURL,在打开文件夹的时候,一般路径的前缀是固定的。提取成如下:
#if UNITY_EDITOR
[MenuItem("QFramework/8.总结之前的方法/5.打开所在文件夹")]
private static void MenuClicked5()
{
OpenInFolder(Application.dataPath);
}
#endif
public static void OpenInFolder(string folderPath)
{
Application.OpenURL("file:///" + folderPath);
}
提取第六个示例
先看代码
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
}
}
核心 API 是 EditorApplication.ExecuteMenuItem。
提取方法后的代码如下。
#if UNITY_EDITOR
[MenuItem("QFramework/8.总结之前的方法/6.MenuItem 复用")]
private static void MenuClicked6()
{
CallMenuItem("QFramework/8.总结之前的方法/4.导出 UnityPackage");
OpenInFolder(Path.Combine(Application.dataPath, "../"));
}
public static void CallMenuItem(string menuPath)
{
EditorApplication.ExecuteMenuItem(menuPath);
}
#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
}
}
这个呢是自定义快捷键,所以目前没有办法复用,只能记在代码里了。在这里我们直接输出一句话就好。
代码如下:
#if UNITY_EDITOR
[MenuItem("QFramework/8.总结之前的方法/7.自定义快捷键")]
private static void MenuClicked7()
{
Debug.Log("%e 意思是快捷键 cmd/ctrl + e");
}
#endif
到此呢,第八个示例的代码算写完了。
如下:
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
using System;
using System.IO;
namespace QFramework
{
public class PreviousFunctions : MonoBehaviour
{
#if UNITY_EDITOR
[MenuItem("QFramework/8.总结之前的方法/1.获取文件名")]
#endif
private static void MenuClicked()
{
Debug.Log(GenerateUnityPackageName());
}
public static string GenerateUnityPackageName()
{
return "QFramework_" + DateTime.Now.ToString("yyyyMMdd_hh");
}
#if UNITY_EDITOR
[MenuItem("QFramework/8.总结之前的方法/2.复制文本到剪切板")]
#endif
private static void MenuClicked2()
{
CopyText("要复制的关键字");
}
public static void CopyText(string text)
{
GUIUtility.systemCopyBuffer = text;
}
#if UNITY_EDITOR
[MenuItem("QFramework/8.总结之前的方法/3.生成文件名到剪切板")]
#endif
private static void MenuClicked3()
{
CopyText(GenerateUnityPackageName());
}
#if UNITY_EDITOR
[MenuItem("QFramework/8.总结之前的方法/4.导出 UnityPackage")]
private static void MenuClicked4()
{
ExportPackage("Assets/QFramework",GenerateUnityPackageName() + ".unitypackage");
}
#endif
public static void ExportPackage(string assetPathName,string fileName)
{
#if UNITY_EDITOR
AssetDatabase.ExportPackage(assetPathName, fileName, ExportPackageOptions.Recurse);
#endif
}
#if UNITY_EDITOR
[MenuItem("QFramework/8.总结之前的方法/5.打开所在文件夹")]
private static void MenuClicked5()
{
OpenInFolder(Application.dataPath);
}
#endif
public static void OpenInFolder(string folderPath)
{
Application.OpenURL("file:///" + folderPath);
}
#if UNITY_EDITOR
[MenuItem("QFramework/8.总结之前的方法/6.MenuItem 复用")]
private static void MenuClicked6()
{
CallMenuItem("QFramework/8.总结之前的方法/4.导出 UnityPackage");
OpenInFolder(Path.Combine(Application.dataPath, "../"));
}
public static void CallMenuItem(string menuPath)
{
EditorApplication.ExecuteMenuItem(menuPath);
}
#endif
#if UNITY_EDITOR
[MenuItem("QFramework/8.总结之前的方法/7.自定义快捷键")]
private static void MenuClicked7()
{
Debug.Log("%e 意思是快捷键 cmd/ctrl + e");
}
#endif
}
}
代码有点辣眼睛,因为宏定义太多了,并且 MenuItem 方法和 public 方法交叉使用,所以我们整理一下,整理后的代码如下。
#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 CallMenuItem(string menuPath)
{
EditorApplication.ExecuteMenuItem(menuPath);
}
public static void OpenInFolder(string folderPath)
{
Application.OpenURL("file:///" + folderPath);
}
#if UNITY_EDITOR
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
}
}
逐个执行菜单,运行结果全部正确。
到此呢,我们可以进行一次导出了。
ok,今天的内容就这些。
转载请注明地址:凉鞋的笔记:liangxiegame.com
更多内容
QFramework 地址:https://github.com/liangxiegame/QFramework
QQ 交流群:623597263
-
Unity 进阶小班:
- 主要训练内容:
- 框架搭建训练(第一年)
- 跟着案例学 Shader(第一年)
- 副业的孵化(第二年、第三年)
- 权益、授课形式等具体详情请查看《小班产品手册》:https://liangxiegame.com/master/intro
- 主要训练内容:
-
关注公众号:liangxiegame 获取第一时间更新通知及更多的免费内容。