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


    Unity 游戏框架搭建 2019 (十二) 第八个示例(二)_第1张图片
    image

你可能感兴趣的:(Unity 游戏框架搭建 2019 (十二) 第八个示例(二))