※ これは 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
配下にディレクトリ付きでコピーされた