Unity 游戏框架搭建 2019 (十二) 第八个示例(二)

在上一篇我们抽取了第一个示例的方法,我们在这篇在接着往下抽取。

提取第二个示例

先看第二个示例的代码。

#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 获取第一时间更新通知及更多的免费内容。

发布了58 篇原创文章 · 获赞 32 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/u010125551/article/details/105157113