在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都去掉了,也可以根据自己的情况添加。