徳島ゲーム開発ごっこ 技術ブログ

ゲームを作るために役に立ったり立たなかったりする技術を学んでいきます!

【Unity】 ScriptTemplates メモ書き

今回は ScriptTemplates に関するメモ書きです。
昔からあるUnityの機能なのですが エディタ拡張入門 が絶版となっているのでメモとして残しておきます。
f:id:urahimono:20211102102958p:plain


この記事にはUnity2020.3.21f1を使用しています。
.Netのバージョン設定には.Net4.x を使用しています。

スクリプトを作るときのテンプレートファイル

さて、UnityEditor 上で新しいスクリプトファイルを作るときには
一般的には Project Window で右クリックを押して、新しいスクリプトを作ると思います。

f:id:urahimono:20211102103014j:plainf:id:urahimono:20211102103016j:plain
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

こんな感じに作られますね。
ただ余計なコメント入っているし、毎回 Start()Update() が必要なわけでもないので、
スクリプトの初期状態をもうちょっと自分好みのものにしたいですね。

ScriptTemplates の機能を使うことで自分好みのテンプレートが作れますよ。
テンプレートの元ファイルは以下のフォルダにあります。

"Unityのインストール先"\Editor\Data\Resources\ScriptTemplates

f:id:urahimono:20211102103028j:plain

ここにあるテキストファイルがテンプレートファイルです。
このファイルを元に新規ファイルは作成されます。
詳しく見てみましょう。

テンプレートファイルのパラメータ

テンプレートファイルの中身はこんな感じになっています。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

    #ROOTNAMESPACEBEGIN#
public class #SCRIPTNAME# : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        #NOTRIM#
    }

    // Update is called once per frame
    void Update()
    {
        #NOTRIM#
    }
}
#ROOTNAMESPACEEND#

基本的には先ほど作成したスクリプトファイルと同じテキストになっていますが、
ところどころ、"##" で括られた謎の文字列があります。

これが パラメーター の文字列となっていて、適切な文字に変換されて使われるみたいですね。
一つずつ見ていきましょう。

#NAME#

これはシンプルです。
ファイルを新規で作成した際のファイル名がそのまま変換されて使われます。
拡張子は省略されます。
スペースも大文字小文字もそのまま変換されるようですね。

New Script
-> New Script
f:id:urahimono:20211102103040j:plain

#SCRIPTNAME#

こちらもファイル名を変換されて使用されるのですが、
スペースは削除されます。
クラス名とかで使うのならこちらのほうがいいですね。

New Script
-> NewScript

#SCRIPTNAME_LOWER#

こちらもファイル名を変換されて使用されるのですが更に特殊です。
スペースが削除されるのは #SCRIPTNAME# と同じですが
最初の文字が大文字の場合は小文字になります。
最初の文字が小文字の場合は "my" が先頭に追加されるんですね。
変数と同じ感覚でしょうか。

New Script
-> newScript
new Script
-> myNewScript

#ROOTNAMESPACEBEGIN#

これはこのプロジェクトのEditor情報を引っ張ってくるタイプです。
Editor 設定の Root namespace を名前空間として変換するんです。
未設定の場合はその行は無かったことになりますよ。
f:id:urahimono:20211102103112j:plain

Test
-> namespace Test {

#ROOTNAMESPACEEND#

そしてこちらは #ROOTNAMESPACEBEGIN# で設定した名前空間の終わりの波括弧に変換されます。
もちろん名前空間が未設定の場合は無かったことになります。

#NOTRIM#

これはちょっとよくわからなかったんですよね。
とりあえず、スクリプトになったときこのパラメータは無くなります。
でも何に使うのかがよくわからない。
フォーラムでも質問であがっていたんだけど、確定したことがわからなかったですね。
forum.unity.com

そして全てのパラメーターをまとめるとこんな感じです。

#ROOTNAMESPACEBEGIN#
    // NAME: #NAME# 
    // SCRIPTNAME: #SCRIPTNAME#
    // SCRIPTNAME_LOWER: #SCRIPTNAME_LOWER#
    // NOTRIM: #NOTRIM#
#ROOTNAMESPACEEND#

New Script というファイルを作った場合。

    // NAME: New Script 
    // SCRIPTNAME: NewScript
    // SCRIPTNAME_LOWER: newScript
    // NOTRIM: 

new Script というファイルを作った場合。

    // NAME: new Script 
    // SCRIPTNAME: newScript
    // SCRIPTNAME_LOWER: myNewScript
    // NOTRIM: 

new Script(名前空間設定あり) というファイルを作った場合。

namespace test
{
    // NAME: new Script 
    // SCRIPTNAME: newScript
    // SCRIPTNAME_LOWER: myNewScript
    // NOTRIM: 
}

テンプレートファイルの命名規則

テンプレートファイルを見ていると複雑な名前になっているんですが、
これには命名規則があるんですよ。
このような規則になっています。

{プライオリティ}-{メニュー名}-{ファイル名}.{拡張子}.txt

プライオリティ

数値で設定している部分ですが
この数値が右クリック時に表示される順番に使われます。
数字が低いほど上に表示されます。
同じ名前のテンプレートがある場合は数値が低いほうが優先されるみたいですね。
f:id:urahimono:20211102103126j:plain

このプライオリティに関しては エディタ拡張入門 の書籍によると
64-70 または 95-190 が好ましいらしいですよ。

メニュー名

この部分はメニュー上に表示される名前として使われます。
二つのアンダーバーをつけることでネストしてメニューで表示することもできますよ。
以下のようなファイルがある場合はこのようになります。
(※ 以下の参考ではアンダーバー全角を使っていますが、これはこのブログでアンダーバー二つ使うとマークダウン処理で太字になってしまうからです)

64-ABC-New.cs.txt
65-JRT_Gogical-New.cs.txt
66-JRT_Focus-New.cs.txt

f:id:urahimono:20211102103137j:plain

ファイル名

この部分はメニューを選択してファイルが作られた際の初期状態のファイル名として使われます。

64-JRT-Gogical.cs.txt

f:id:urahimono:20211102103148j:plain

拡張子

そのまんまですね、ファイルの拡張子として使われます。

プロジェクト毎にテンプレートを設定する

今までは、Unity がインストールしているフォルダの ScriptTemplates をいろいろ改良していました。
ただこの設定は個人のパソコンの設定なので、他の人はこの設定はもちろん使えません。
チームで作業している場合は、全員のパソコンにこの設定をしてあげる必要があります。
さらに別のUnityバージョンをインストールした場合、そちらのフォルダの ScriptTemplates を再度設定しなくてはいけません。

これは面倒くさい。
プロジェクト毎に設定したいものです。

そのやり方は簡単で
ScriptTemplates フォルダをプロジェクト内に作り、その中にテンプレートファイルを作ればこのプロジェクト専用のテンプレートファイルにすることができるんです。
Unityインストール先の ScriptTemplates 同じファイル名がある場合は、このフォルダの中にあるテンプレートが優先されます。

ただ注意点もいくつかあります。

どうやらテンプレートファイルはUnity立ち上げ時に読み込まれるようなので、
テンプレートを変更・追加した場合はUnityの再起動が必須なのです。

そして ScriptTemplates フォルダは必ず Assets 直下にある必要があるんです。
最新のUnityでは、EditorResources など固有のフォルダでも比較的に好きな場所に配置できるのですが、 ScriptTemplates だけは直下必須です。
他の場所にある場合は適応されません。
f:id:urahimono:20211102103214j:plain

ScriptTemplates の機能をつかえば、
新しいスクリプトなどを作るときにちょっと楽ができるかもしれませんね。