找回密碼
 注冊帳號

掃一掃,訪問微社區

涼鞋同學 Unity 游戲框架搭建 2019 (十二) 第八個示例(二)

0
回復
146
查看
打印 上一主題 下一主題
[ 復制鏈接 ]
排名
2324
昨日變化

78

主題

526

帖子

2471

積分

Rank: 9Rank: 9Rank: 9

UID
148923
好友
67
蠻牛幣
2663
威望
0
注冊時間
2016-5-17
在線時間
845 小時
最后登錄
2020-4-18

專欄作家

QQ

馬上注冊,結交更多好友,享用更多功能,讓你輕松玩轉社區。

您需要 登錄 才可以下載或查看,沒有帳號?注冊帳號

x
在上一篇我們抽取了第一個示例的方法,我們在這篇在接著往下抽取。提取第二個示例
先看第二個示例的代碼。
[C#] 純文本查看 復制代碼
#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 類型的參數,用來接收要復制的內容。抽取后的方法如下。
[C#] 純文本查看 復制代碼
#if UNITY_EDITOR
        [MenuItem("QFramework/8.總結之前的方法/2.復制文本到剪切板")]
#endif
        private static void MenuClicked2()
        {
            CopyText("要復制的關鍵字");
        }

        public static void CopyText(string text)
        {
            GUIUtility.systemCopyBuffer = text;
        }

提取第三示例
我們接著看第三個示例
[C#] 純文本查看 復制代碼
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 同等的功能的。
代碼如下:
[C#] 純文本查看 復制代碼
#if UNITY_EDITOR
        [MenuItem("QFramework/8.總結之前的方法/3.生成文件名到剪切板")]
#endif
        private static void MenuClicked3()
        {
            CopyText(GenerateUnityPackageName());       
        }
#if UNITY_EDITOR
        [MenuItem("QFramework/8.總結之前的方法/3.生成文件名到剪切板")]
#endif
        private static void MenuClicked3()
        {
            CopyText(GenerateUnityPackageName());      
        }
提取第四示例
第四個示例代碼如下:
[C#] 純文本查看 復制代碼
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。抽取后的方法如下。
[C#] 純文本查看 復制代碼
#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
        }

提取第五個示例
首先看代碼:
[C#] 純文本查看 復制代碼
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,在打開文件夾的時候,一般路徑的前綴是固定的。提取成如下:
[C#] 純文本查看 復制代碼
#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);

        }

提取第六個示例
先看代碼
[C#] 純文本查看 復制代碼
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。
提取方法后的代碼如下。
[C#] 純文本查看 復制代碼
#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

提取第七個示例
先看代碼:
[C#] 純文本查看 復制代碼
#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
    }
}

這個呢是自定義快捷鍵,所以目前沒有辦法復用,只能記在代碼里了。在這里我們直接輸出一句話就好。
代碼如下:
[C#] 純文本查看 復制代碼
#if UNITY_EDITOR
        [MenuItem("QFramework/8.總結之前的方法/7.自定義快捷鍵")]
        private static void MenuClicked7()
        {
            Debug.Log("%e 意思是快捷鍵 cmd/ctrl + e");
        }
#endif

到此呢,第八個示例的代碼算寫完了。
如下:
[C#] 純文本查看 復制代碼
#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 方法交叉使用,所以我們整理一下,整理后的代碼如下。
[C#] 純文本查看 復制代碼
#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 獲取第一時間更新通知及更多的免費內容。





回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 注冊帳號

本版積分規則

神马电影34pp影视午夜