第15章 ScriptTemplates - エディター拡張入門

第15章 ScriptTemplates

EditorWindow を生成するスクリプトを作成するとき、みなさんはどうしていますか?

ここで、長くなりますが「EditorWindow を作成して GUI 描画部分を実装する準備が整うまで」を順番に説明していきます。

  • NewBehaviourScript.cs を作成
using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour {

    //Use this for initialization
    void Start () {

    }

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

    }
}
  • Start と Update メソッド、System.Collections を消して...
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour {
}
  • using UnityEditor;を付けて...
using UnityEngine;
using UnityEditor;

public class NewBehaviourScript : MonoBehaviour {
}
  • EditorWindow を継承するようにして...
using UnityEngine;
using UnityEditor;

public class NewBehaviourScript : EditorWindow {
}
  • EditorWindow を開くために MenuItem を追加して...
using UnityEngine;
using UnityEditor;

public class NewBehaviourScript : EditorWindow
{
    [MenuItem("Window/NewBehaviourScript")]
    static void Open ()
    {

    }
}
  • GetWindow と OnGUI を追加する
using UnityEngine;
using UnityEditor;

public class NewBehaviourScript : EditorWindow
{
    [MenuItem("Window/NewBehaviourScript")]
    static void Open ()
    {
        GetWindow<NewBehaviourScript> ();
    }

    void OnGUI ()
    {

    }
}

ここまでやって、やっと EditorWindow の GUI 部分を作成する準備が整いました。実際に手を動かすときは手順が少なく感じますが、MenuItem の追加がかなり手間と感じます。

  • 必ず EditorWindow を継承したい
  • 必ず MenuItem を追加したい
  • 必ず OnGUI を追加したい

というような場合、ScriptTemplates を作成することで解決できます。

15.1 ScriptTemplates とは

スクリプトファイルを作成するときには、テンプレートファイルと呼ばれるものをベースにスクリプトファイルを作成します。皆さんがよく使う、メニューの Assets/Create/C# Script もテンプレートファイルを使用して NewBehaviourScript.cs が作成されています。

テンプレートファイルが保存されている場所

テンプレートファイルは、次の場所に保存されています。

表15.1: ビルトインの ScriptTemplates

OS保存場所
Mac/Applications/Unity/Unity.app/Contents/Resources/ScriptTemplates
WindowsC:\Program Files\Unity\Editor\Data\Resources\ScriptTemplates

図15.1:

テンプレートファイルの中身

81-C# Script-NewBehaviourScript.cs.txt の中身を見てみましょう。

using UnityEngine;
using System.Collections;

public class #SCRIPTNAME# : MonoBehaviour {

    //Use this for initialization
    void Start () {

    }

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

    }
}

#SCRIPTNAME#というのがあるのがわかります。これは Unity上でスクリプト名を決定した時に置換するためのパラメータとなっています。他にも専用のパラメータが存在します。すべてのパラメータを 表15.2 にまとめます。

表15.2: ScriptTemplates で使用できるパラメータ

パラメータ名説明
#NAME#そのままのスクリプトファイル名(拡張子なし)
#SCRIPTNAME#スクリプト名。スペースは削除されます(拡張子なし)
例: New Script -> NewScript
#SCRIPTNAME_LOWER#スクリプト名。スペースは削除されます(拡張子なし)
もし入力した最初の文字が小文字の場合先頭に「my」をつけます
例: new Script -> myNewScript

15.2 テンプレートファイルの作成

テンプレートのファイル名には規則があります。この規則は必ず守るようにしましょう。

{priority}-{メニュー名}-{ファイル名}.{拡張子}.txt

表15.3: パラメータの説明

パラメータ名説明
priorityメニューの表示順。値が高いほどメニューの下側に表示されます
メニュー名Unity で表示するメニュー名になるもの
ファイル名新規作成時にデフォルトで設定されているファイル名
拡張子作成したいファイルの拡張子

例として、EditorWindow を作成するスクリプトテンプレートは次のコードになります。

作成するファイル:
121-C# EditorWindow Script-NewEditorWindow.cs.txt

using UnityEngine;
using UnityEditor;

public class #SCRIPTNAME# : EditorWindow
{
    [MenuItem("Window/#SCRIPTNAME#")]
    static void Open()
    {
        GetWindow<#SCRIPTNAME#> ();
    }

    void OnGUI ()
    {

    }
}

15.3 テンプレートファイルの配置

テンプレートファイルを配置できる場所は2ヶ所あります。

1つは Unity がインストールされている場所

表15.4: ビルトインの ScriptTemplates

OS保存場所
Mac/Applications/Unity/Unity.app/Contents/Resources/ScriptTemplates
WindowsC:\Program Files\Unity\Editor\Data\Resources\ScriptTemplates

もう1つは、Unity プロジェクトの Assets/ScriptTemplates です。

今回は Assets/ScriptTemplates に配置してみることにしましょう。

図15.2:

配置した後は、必ず Unity エディターを再起動します。この ScriptTemplates が読み込まれるのは Unity エディターの起動時のみだからです。

再起動した後、Assets/Create メニューに自作したテンプレートファイルのメニューが追加されているのがわかります。

「C# EditorWindow Script」が追加されている

図15.3: 「C# EditorWindow Script」が追加されている

実際にテンプレートを使ってスクリプトを作成してみましょう。

スクリプトのデフォルト名が「NewEditorWindow」となっている

図15.4: スクリプトのデフォルト名が「NewEditorWindow」となっている

デフォルト名「NewEditorWindow」で作成するとスクリプトの中身は次のコードになります。

using UnityEngine;
using UnityEditor;

public class NewEditorWindow : EditorWindow
{
    [MenuItem("Window/NewEditorWindow")]
    static void Open()
    {
        GetWindow<NewEditorWindow> ();
    }

    void OnGUI ()
    {

    }
}

15.4 メニューの表示位置

メニューの位置は priority により決まります。priority について詳しくは 第8章「MenuItem」 をご覧ください。

<code class="inline-code tt">Assets/Create</code> の各 priority

図15.5: Assets/Create の各 priority

表15.5: Assets/Create の各 priority

パラメータ名priority
Folder53
C# Script81
Javascript82
Shader83

priority が86の C# Script が2つありますが、仕様として priority が低いものがテンプレートとして優先されます。

自作のテンプレートとして表示するときには、デフォルトのテンプレートの近くにあったほうがいいので、priority は64-70、または95-190 が好ましいです。

15.5 ProjectWindowUtil との組み合わせ

ProjectWindowUtil クラスの StartNameEditingIfProjectWindowExists と組み合わせると Assets/ScriptTemplates にテンプレートファイルを置かずとも、スクリプトを作成できるようになります。詳しくは 第11章「ProjectWindowUtil」 をご覧ください。

第14章 ReorderbleList 第16章 Gizmo(ギズモ)