[Unity] プロジェクト単位でカスタムテンプレートを適用する

前回の記事でUnityのスクリプトテンプレートを書き換える方法を紹介しました。

しかし、上記にはいくつかの問題点が存在します。

 ・インストールされたUnity全体に影響が及ぶ
 ・共同開発では各々のPCで設定する必要あり
 ・1台のPCで異なるテンプレートを併用することが出来ない

テンプレートの変更はインストールされたUnity配下のファイルを弄ることになるので当然といえば当然です。

そこで、上記の問題を払拭するためにUnityプロジェクト個別にテンプレートを適用する方法を考えてみました。

■実現方針
Unityプロジェクトそれぞれに対してテンプレートを適用するので、Assetsディレクトリ配下にテンプレートファイルを置いて、これをスクリプト作成時に用いるようにします。
Unityにはもともとそのような機能は無いため、エディタ拡張機能を用いて実現する形となります。

スクリプト作成時に読み出し処理を行うためには、以下のようにAssetPostprocessorの派生クラスを定義したスクリプトをAssets配下に置いておきます。

上記のOnPostprocessAllAssets()の第1引数importedAssetsより新規作成されたスクリプトファイルへのパスを取得できます。
ここで厄介なのが、importedAssetsには外部からインポートされたファイルも含むことです。
また、OnPostprocessAllAssets()の呼び出されるタイミングがインポート終了後というのも曲者です。

このままでは新規作成されたのか外部からインポートされたのか判断できません。
外部からインポートされたファイルを書き換えてしまうと大変なので、何とかして新規作成かどうかの判定を行います。

新規作成されたスクリプトはUnityのテンプレートファイルから作成されるため、こちらと中身が一致していれば新規作成かどうかの判定ができます。
ファイル内容比較を新規作成/インポートのたびに行うため、非常に非効率な方法です。
他に思いつく方法が無いので今回はこれで行きます。

テンプレートの読み書きは.NET FrameworkのファイルIOで実現できます。

■導入手順
1.以下パスのディレクトリを丸ごとコピーし、UnityプロジェクトのAssets配下にドラッグします。

Windows
 (Unityのインストールパス)EditorDataResourcesScriptTemplates
Mac
 (Unityのインストールパス)ContentsResourcesScriptTemplates

unity-pj-template

2.以下スクリプトをAssets配下の任意の場所に置きます。

TemplateGenerator.cs

3.TEMPLATE_DIRに1.のScriptTemplatesディレクトリへのパスを指定します。
Assets直下に置いた場合は変更する必要がありません。

これでAssets配下のScriptTemplatesのテンプレートが適用されるようになります。

必要なら50行目付近に置換したいシンボルを追加してください。
例としてスクリプトの制作者名と作成した日付を定義しています。

以上で導入手順は終わりです。

かなり乱暴な手法となってしまいましたが、プロジェクト個別にテンプレートを設定する方法が無かったため紹介させていただきました。