unity自动添加命名空间脚本

在Editor文件夹下创建一个AddNamespace文件夹,在下面创建一个NamespaceData.txt文件,用于存储我们需要设置的命名空间的名字,以及是否启用此脚本,因为可能会用到一些框架或插件需要自动生成代码,例如Entitas,如果框架生成的代码被修改了命名空间会引发错误,通过设置一个布尔类型的变量Enable来作为开关,控制是否启用此脚本,开关变量一并存储在此文本文件中。

还是在该文件夹下,创建一个脚本,用于拓展编辑器,程序和注释如下

using System.IO;
using UnityEditor;
using UnityEngine;

namespace CustomTool 
 {
    /// <summary>
    /// 编辑器上方用于更改命名空间的窗口
    /// </summary>
    public class SetNamespaceWindow : EditorWindow
    {
        private static string Namespace;

        public static bool Enable { get; private set; }

        [MenuItem("Tools/Namespace/SetNamespace")]
        public static void ShowWindow()
        {
            GetWindowWithRect(typeof(SetNamespaceWindow), new Rect(500, 500, 500, 300));    //创建一个窗口

            StreamReader reader = new StreamReader("Assets\\Editor\\AddNamespace\\NamespaceData.txt");
            string input = reader.ReadLine();                       //读取数据文件里的第一行,存储的是命名空间的名字

            if (string.IsNullOrEmpty(input) == true) Namespace = "Please input namespace";
            else Namespace = input;

            Enable = reader.ReadLine() == "True" ? true : false;            //读取第二行,存储的是是否启用此脚本
            reader.Close();
        }

        private void OnGUI()
        {
            GUILayout.Label("Set Namespace", EditorStyles.boldLabel);
            Namespace = EditorGUILayout.TextField("Namespace", Namespace);
            Enable = EditorGUILayout.Toggle("Change Enable", Enable);

            //如果点击按钮,把自己设置的命名空间写进文本文件中,使用时从里面读取
            if (GUILayout.Button("OK"))
            {
                StreamWriter streamWriter = new StreamWriter("Assets\\Editor\\AddNamespace\\NamespaceData.txt");
                streamWriter.WriteLine(Namespace);
                streamWriter.WriteLine(Enable.ToString());   
                Debug.Log("命名空间修改成功");
                streamWriter.Close();
            }
        }
    }
}

上面的脚本是用来设置命名空间的名字和开关状态,并把它存储在文本文件中,用于后面的读取。

还是在上述文件夹中,再创建一个脚本,用于在新建脚本文件时修改添加命名空间,程序和注释如下

using System.IO;
using System.Text;
using UnityEngine;

namespace CustomTool
{
    /// <summary>
    /// 自动添加命名空间
    /// </summary>
    public class AddNamespace : UnityEditor.AssetModificationProcessor
    {
        //这个函数在每次新建一个资源时会执行,传入的参数是该资源的meta文件的完整路径
        static void OnWillCreateAsset(string asset)
        {
            //从文本文件中读取数据
            StreamReader sr = new StreamReader("Assets\\Editor\\AddNamespace\\NamespaceData.txt");
            sr.ReadLine();                                      //把第一行忽略掉,光标移到第二行
            bool enable = sr.ReadLine() == "True" ? true : false;               //读取存储的数据,决定是否要设置命名空间
            sr.Close();

            if (enable == true)
            {
                //创建任何文件或资源时都会同时创建一个伴随的.meta文件,两者路径是一样的,所以
                //把传入的参数去掉.meta后缀就是我们需要的文件,下面两行都是去掉后缀名,任选其一就行
                //string filePath = asset.Remove(asset.Length - 5);
                string filePath = asset.Replace(".meta", "");

                if (filePath.EndsWith(".cs") == true)   //如果是cs脚本文件才执行后面的
                {
                    //从文本文件中读取到之前设置的命名空间
                    StreamReader reader = new StreamReader("Assets\\Editor\\AddNamespace\\NamespaceData.txt");
                    string nameSpace = reader.ReadLine();
                    if (string.IsNullOrEmpty(nameSpace) == true)
                    {
                        Debug.LogError("需要设置的命名空间为空");
                        reader.Close();
                        return;
                    }
                    reader.Close();

                    StringBuilder stringBuilder = new StringBuilder();
                    StreamReader streamReader = new StreamReader(filePath);
                    for (int i = 0; i < 4; i++)         //这一轮循环是为了把新建的脚本三行的using和后面的一行空行去掉。
                        streamReader.ReadLine();

                    stringBuilder.Append("namespace " + nameSpace + "\n{\n");  //一个namespace,后面跟上我们需要设置的命名空间的名字,换行,括号,再换行

                    string temp = streamReader.ReadLine();  //这一读取的是  public class NewBehaviourScript : MonoBehaviour
                    temp = temp.Replace(": MonoBehaviour", "");     //把后面的MonoBehaviour去掉,

                    stringBuilder.Append("    " + temp + "\n");     //把刚刚读取到的字符串添加进来,前面空4格是为了对齐,下面两行同理
                    stringBuilder.Append("    {\n");
                    stringBuilder.Append("    }\n}");
                    streamReader.Close();

                    StreamWriter streamWriter = new StreamWriter(filePath);     //把上面的stringBuilder写入,并覆盖原有的字符串
                    streamWriter.Write(stringBuilder);
                    streamWriter.Close();
                }
            }
        }
    }
}

下面演示一下,首先在自定义的编辑器中把命名空间改为UIFramework,并点击OK

在这里插入图片描述

新建一个脚本,如图

在这里插入图片描述

这里我把后面的MonoBehaviour和前面三行using都去掉了,也可以根据自己的情况添加。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值