ScriptHelper(模板控制)

1、模板配置

/*******************************************************************************
* 版本声明:v1.0.0
* 类 名 称:EditorScriptsConfig
* 创建日期:2020-04-13 14:52:46
* 作者名称:末零
* 功能描述:脚本模板-配置
******************************************************************************/

using System.IO;
using UnityEditor;
using UnityEngine;

namespace LastZero.ScriptHelper
{
    /// <summary>
    /// 脚本模板
    /// </summary>
    public class EditorScriptsConfig : ScriptableObject
    {
        /// <summary>
        /// 作者
        /// </summary>
        [Header("作者")]
        public string Author = "Author";

        /// <summary>
        /// 命名空间
        /// </summary>
        [Header("名称空间")]
        public string NameSpace = "NameSpace.Author";

        /// <summary>
        /// 模板路径
        /// </summary>
        [Header("模板路径")]
        public string TemplatePath = "Assets/LastZeroFrame/Scripts/1.ScriptHelper/Template/";

        private const string EditorScriptsConfigFile = "EditorScriptsConfigFile.asset";

        private static string editorScriptsConfigCsPath;
        public static string EditorScriptsConfigCsPath
        {
            get
            {
                if (!string.IsNullOrEmpty(editorScriptsConfigCsPath))
                {
                    return editorScriptsConfigCsPath;
                }

                var result = Directory.GetFiles(Application.dataPath + "/LastZeroFrame/Scripts/1.ScriptHelper", "EditorScriptsConfig.cs", SearchOption.AllDirectories);
                if (result.Length >= 1)
                {
                    editorScriptsConfigCsPath = Path.GetDirectoryName(result[0]);
                    editorScriptsConfigCsPath = editorScriptsConfigCsPath.Replace('\\', '/');
                    editorScriptsConfigCsPath = editorScriptsConfigCsPath.Replace(Application.dataPath, "Assets");

                    editorScriptsConfigCsPath = editorScriptsConfigCsPath + "/" + EditorScriptsConfigFile;
                }

                return editorScriptsConfigCsPath;
            }
        }

        private static EditorScriptsConfig instanceField;
        public static EditorScriptsConfig Instance
        {
            get
            {
                if (instanceField != null)
                {
                    return instanceField;
                }

                instanceField = (EditorScriptsConfig)AssetDatabase.LoadAssetAtPath(EditorScriptsConfigCsPath, typeof(EditorScriptsConfig));
                if (instanceField == null)
                {
                    instanceField = ScriptableObject.CreateInstance<EditorScriptsConfig>();
                    AssetDatabase.CreateAsset(instanceField, EditorScriptsConfigCsPath);
                }

                return instanceField;
            }
        }
    }
}

2、模板设置

/*******************************************************************************
* 版本声明:v1.0.0
* 类 名 称:EditorScriptsConfigWindow
* 创建日期:2020-04-13 14:53:16
* 作者名称:末零
* 功能描述:脚本模板-设置
******************************************************************************/

using UnityEditor;
using UnityEngine;

namespace LastZero.ScriptHelper
{
    /// <summary>
    /// 脚本配置窗口
    /// </summary>
    public class EditorScriptsConfigWindow : EditorWindow
    {
        /// <summary>
        /// 脚本配置菜单
        /// </summary>
        // Add a new menu item with hotkey ALT-F
        [MenuItem("EditorTools/Template Config &F")]
        static void ScriptsConfig()
        {
            EditorScriptsConfigWindow configWindow = new EditorScriptsConfigWindow();
            configWindow.minSize = new Vector2(600, 300);
            configWindow.maxSize = new Vector2(600, 300);
            configWindow.Show();
        }

        private void OnGUI()
        {
            GUILayout.BeginVertical();
            GUILayout.Space(30);
            GUI.skin.label.fontSize = 15;

            GUI.skin.label.alignment = TextAnchor.UpperLeft;
            this.titleContent = new GUIContent("脚本生成配置");

            EditorScriptsConfig.Instance.Author = EditorGUILayout.TextField("作者:", EditorScriptsConfig.Instance.Author);
            GUILayout.Space(10);
            EditorScriptsConfig.Instance.NameSpace = EditorGUILayout.TextField("名称空间:", EditorScriptsConfig.Instance.NameSpace);

            GUILayout.Space(10);
            EditorScriptsConfig.Instance.TemplatePath = EditorGUILayout.TextField("模板路径: ", EditorScriptsConfig.Instance.TemplatePath);

            GUI.skin.label.alignment = TextAnchor.MiddleCenter;
            GUILayout.Space(20);
            GUI.color = Color.green;
       
            if (GUILayout.Button("完成"))
            {
                if (!EditorScriptsConfig.Instance.TemplatePath.EndsWith("/"))
                    EditorScriptsConfig.Instance.TemplatePath += "/";
                EditorUtility.SetDirty(EditorScriptsConfig.Instance);
                AssetDatabase.SaveAssets();
                AssetDatabase.Refresh();
                this.Close();
                   
            }
            GUILayout.EndVertical();
        }
    }
}

3、创建菜单

/*******************************************************************************
* 版本声明:v1.0.0
* 类 名 称:CreateAssetAction
* 创建日期:2020-04-13 14:49:14
* 作者名称:末零
* 功能描述:脚本模板-菜单
******************************************************************************/

using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;

using UnityEngine;
using UnityEditor;
using UnityEditor.ProjectWindowCallback;

namespace LastZero.ScriptHelper
{
    public class CreateAssetAction
    {
        /// <summary>
        /// 添加Assets/Create/LastZero C#子菜单并创建MonoBehaviour脚本
        /// </summary>
        [MenuItem("Assets/Create/LastZero C#", false, 60)]
        public static void CreateNormalCS()
        {
            //参数为传递给CreateEventCSScriptAsset类action方法的参数  
            ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0,
                ScriptableObject.CreateInstance<CreateEventCSScriptAsset>(),
                GetSelectPathOrFallback() + "/NewScript.cs", EditorGUIUtility.FindTexture("cs Script Icon"),
                EditorScriptsConfig.Instance.TemplatePath+ "C#Script.cs.txt");
        }

        /// <summary>
        /// 获取路径
        /// </summary>
        /// <returns></returns>
        public static string GetSelectPathOrFallback()
        {
            string path = "Assets";
            //遍历选中的资源以获得路径  
            //Selection.GetFiltered是过滤选择文件或文件夹下的物体,assets表示只返回选择对象本身  
            foreach (
                UnityEngine.Object obj in 
                Selection.GetFiltered(typeof(UnityEngine.Object), 
                SelectionMode.Assets))
            {
                path = AssetDatabase.GetAssetPath(obj);
                if (!string.IsNullOrEmpty(path) && File.Exists(path))
                {
                    path = Path.GetDirectoryName(path);
                    break;
                }
            }
            return path;
        }
    }

    //要创建模板文件必须继承EndNameEditAction,重写action方法  
    class CreateEventCSScriptAsset : EndNameEditAction
    {
        public override void Action(int instanceId, string pathName, string resourceFile)
        {
            //创建资源  
            UnityEngine.Object obj = CreateScriptAssetFromTemplate(pathName, resourceFile);
            ProjectWindowUtil.ShowCreatedAsset(obj);//高亮显示资源  
        }

        internal static UnityEngine.Object CreateScriptAssetFromTemplate(string pathName, string resourceFile)
        {
            //获取要创建资源的绝对路径  
            string fullPath = Path.GetFullPath(pathName);

            //读取本地的模板文件  
            StreamReader streamReader = new StreamReader(resourceFile);
            string text = streamReader.ReadToEnd();
            streamReader.Close();

            //获取文件名,不含扩展名  
            string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(pathName);

            //将模板类中的类名替换成你创建的文件名  
            text = Regex.Replace(text, "#ScriptName#", fileNameWithoutExtension);
            text = Regex.Replace(text, "#Author#", EditorScriptsConfig.Instance.Author);
            text = Regex.Replace(text, "#NameSpace#", EditorScriptsConfig.Instance.NameSpace);
            text = Regex.Replace(text, "#NowTime#", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

            //写入配置文件  
            bool encoderShouldEmitUTF8Identifier = true; //参数指定是否提供 Unicode 字节顺序标记  
            bool throwOnInvalidBytes = false;//是否在检测到无效的编码时引发异常  
            bool append = false;
            UTF8Encoding encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier, throwOnInvalidBytes);
            StreamWriter streamWriter = new StreamWriter(fullPath, append, encoding);
            streamWriter.Write(text);
            streamWriter.Close();
            
            //刷新资源管理器  
            AssetDatabase.ImportAsset(pathName);
            AssetDatabase.Refresh();
            return AssetDatabase.LoadAssetAtPath(pathName, typeof(UnityEngine.Object));
        }
    }
}

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

末零

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值