しっぽを追いかけて

ぐるぐるしながら考えています

Unity と猫の話題が中心   掲載内容は個人の私見であり、所属組織の見解ではありません

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

コピーされた