Unity
Editor拡張

Unityのエディタ上で作ったスクリプトに自動でnamespaceをつける

https://gyazo.com/9798ec353c0a7bcb933edb7755f2b055

自分の作るスクリプトには自動で独自に設定した名前空間を設定したい.
ストアを見た感じ手軽な拡張が見当たらなかったのでEditor拡張の練習がてら作ってみた.

具体的にはUnityでアセットを新しく生成した時に呼ばれるコールバックがあるのでそこでスクリプトのパスをもらい,C#スクリプトテンプレートに文字列操作で先頭に"namespace (自分の名前空間) {"を,末尾に"}"を追加する.

パッケージを作ったのでよければどうぞ

ScriptNamespace.unitypackage

AddCustomNameSpace.cs
using UnityEngine;
using UnityEditor;
using System.IO;

namespace ScriptNamespace
{
    public class AddCustomNameSpace : UnityEditor.AssetModificationProcessor
    {
        public static void OnWillCreateAsset(string path)
        {
            var setting = Resources.Load("NewScriptSetting") as NewScriptSetting;
            if (setting == null) return;
            var namespaceString = setting.nameSpace;

            var filePath = path.Replace(".meta", "");
            if (System.IO.Path.GetExtension(filePath) != ".cs") return;
            var index = Application.dataPath.LastIndexOf("Assets", System.StringComparison.Ordinal);
            var absoluteFilePath = Application.dataPath.Substring(0, index) + filePath;

            using (var stream = new FileStream(absoluteFilePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
            {
                using (var reader = new StreamReader(stream))
                {
                    using (var writer = new StreamWriter(stream))
                    {
                        var texts = reader.ReadToEnd();
                        stream.Position = 0;
                        var lines = texts.Split('\n');
                        // 全行にインデント
                        for (int i = 0; i < lines.Length; i++)
                        {
                            lines[i] = lines[i].Insert(0, "\t");
                        }
                        texts = string.Join("\n", lines);
                        texts = texts.Insert(0, string.Format("namespace {0}\n{1}\n", namespaceString, System.Text.RegularExpressions.Regex.Unescape("{")));
                        texts = texts.Insert(texts.Length - 1, "}\n");
                        writer.Write(texts);
                    }
                }
            }

            AssetDatabase.Refresh();
        }
    }
}
NewScriptSettingCreator.cs
namespace ScriptNamespace
{
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEditor;
    public class NewScriptSettingCreator : Editor {
        [MenuItem ("Assets/Create/ScriptNamespace/NewScriptSetting")]
        static void Create(){
            var instance = CreateInstance<NewScriptSetting>();
            AssetDatabase.CreateAsset(instance, "Assets/Resources/NewScriptSetting.asset");
            AssetDatabase.Refresh();
        }
    }
}   
NewScriptSetting.cs
namespace ScriptNamespace 
{
    using UnityEngine;

    public class NewScriptSetting : ScriptableObject {
        public string nameSpace;
    }
}