Unity 2021 でローカルパッケージにテンプレートファイルを含めるようにする
※ これは 2022/01/01 時点の Unity 2021.2.7f1 の情報です
最新版では動作が異なる可能性がありますのでご注意ください
あけましておめでとうございます!今年もよろしゅう~
Packages 管理の自作基盤ライブラリで Assets 側にアプリアイコン画像などテンプレートファイルを下記のようにコピーできるようにしたい

ただの画像ファイルならこのままでもなんとかなりそうだが、.cs ファイルなどだとライブラリ側とアプリ側で競合してエラーが起きるのでひと工夫が必要
とりあえずライブラリ側のテンプレートファイルを無効化するために Templates ディレクトリの先頭にピリオドをつけて .Templates に改名
こうすることで UnityEditor からは .Templates ディレクトリが認識されず無効化された

あとはテンプレートファイルをコピーするコードを Editor に追加
using System.IO; using System.Linq; using UnityEditor; using UnityEngine; using UniRx; namespace MatatabiUx.Common.Editor { public class ProjectTool { [MenuItem("Tools/Project Settings Initialize")] public static void Initialize() { CopyTemplates(); AssetDatabase.Refresh(); EditorApplication.ExecuteMenuItem(@"File/Save Project"); } /// <summary> /// Templetes からファイルを再帰的にコピーする /// </summary> /// <param name="overwrite">上書きフラグ</param> private static void CopyTemplates(bool overwrite = false) { var root = new DirectoryInfo(Path.Combine(Application.dataPath, $"../Packages/Common/Editor/.Templates")); var dest = new DirectoryInfo(Application.dataPath); var directories = Directory.GetDirectories(root.FullName, "*", SearchOption.AllDirectories); for (var i = 0; i < directories.Length; i++) { var directory = directories[i]; var info = new DirectoryInfo(directory); var destDir = info.FullName.Replace(root.FullName, dest.FullName); if (!Directory.Exists(destDir)) Directory.CreateDirectory(destDir); var files = info.GetFiles(); for (var l = 0; l < files.Length; l++) { var file = files[l]; var destFile = file.FullName.Replace(root.FullName, dest.FullName); if (!overwrite && File.Exists(destFile)) continue; // 上書きコピーはしない File.Copy(file.FullName, destFile, overwrite); } } } } }
MenuItem 属性をつけてメニューから呼び出せるようにした上で、CopyTemplates() メソッドで再帰的に .Templates ディレクトリの中身を Assets 配下にコピーするように記述
コピー後にアプリ側で調整できるように、すでにファイルがあった場合は上書きしないようにするオプションも追加した
UnityEditor の [Tools] - [Project Settings Initialize] を選択してお試し実行

ちゃんと Assets 配下にディレクトリ付きでコピーされた
