KENTEM TechBlog

建設業のDXを実現するKENTEMの技術ブログです。

【Unity6】スクリプトのテンプレートを自作する方法(2/2)

前回の記事では「.cs.txt」という特殊なテキストファイルを用いたテンプレートの作成とメリット、デメリットの比較を行いました。

本記事では、クラスや名前空間の名前以外は動的に埋め込むことができないというデメリットを解消できるよう、Editor拡張を用いてテンプレートの作成を行った事例を紹介いたします。

Editor拡張の実装方法に関する記事はたくさんあります。

そのため本記事ではEditor拡張の使い方は最低限にとどめ、Editor拡張を用いてファイルの作成を行うときに便利になった点を中心に記載しています。

Editor拡張を行う方法

「Assets」フォルダの直下に「Editor」というフォルダを作成します。

Editor拡張のためのファイルの作成

Editor拡張ではMonoBehaviourではなくEditorWindowを継承します。

UIの作成はGUILayoutというクラスを用います。

これを用いることでInputやCheckboxなどWebページの入力項目でよく見かける入力欄を表示することができます。

Editor拡張を用いることで作れるテンプレートの例

一例として次のことが可能なEditor拡張のスクリプトを示します。

  • StartやUpdateなどのメソッドをファイル生成時に埋め込むかをチェックボックスで指定する
  • Debug.Logで表示したい文字列をテキストボックスで入力する
using System;
using System.IO;
using UnityEditor;
using UnityEngine;

public class EditorTemplate : EditorWindow
{
    private string _fileName = "";
    private string _debugMessage = "";
    private bool _useStart = false;
    private bool _useUpdate = false;

    [MenuItem("Assets/Create/Scripting/Editor拡張を用いたテンプレート作成")]
    private static void ShowWindow()
    {
        GetWindow<EditorTemplate>("テンプレート作成");
    }

    private void OnGUI()
    {
        GUILayout.Label("テンプレート作成", EditorStyles.boldLabel);
        _fileName = GUILayout.TextField(_fileName);
        GUILayout.Label("Debug.Logに表示するメッセージ");
        _debugMessage = GUILayout.TextField(_debugMessage);
        _useStart = GUILayout.Toggle(_useStart, "Startが必要");
        _useUpdate = GUILayout.Toggle(_useUpdate, "Updateが必要");
        if (GUILayout.Button("作成"))
        {
            File.WriteAllText(
                Path.Combine(ActivePath(), _fileName + ".cs"),
                OutputText(_fileName, _debugMessage, _useStart, _useUpdate)
            );
            AssetDatabase.Refresh();
        }
    }

    private string ActivePath() => Path.Combine(AssetDatabase.GetAssetPath(Selection.activeObject));

    private string OutputText(string fileName, string debugMessage, bool useStart, bool useUpdate)
    {
        return $@"using UnityEngine;

namespace SampleAssembly
{{
    public class {fileName} : MonoBehaviour
    {{
        private void Awake() {{
            Debug.Log(""{debugMessage}"");
        }} {(useStart ? $@"
        private void Start() {{
            // Start処理
        }}" : String.Empty)} {(useUpdate ? $@"
        private void Update() {{
            // Update処理
        }}" : String.Empty)}
    }}
}}";
    }
}

上記のスクリプトをEditor拡張で呼び出してみます。

まず、次のように2つのチェックボックスを両方ONにして「作成」ボタンをクリックした場合、下記のようにStartとUpdateメソッドが記されたファイルが生成されます。

using UnityEngine;

namespace SampleAssembly
{
    public class StartAndUpdateTemplate : MonoBehaviour
    {
        private void Awake() {
            Debug.Log("Hello World!!");
        } 
        private void Start() {
            // Start処理
        } 
        private void Update() {
            // Update処理
        }
    }
}

次に、2つのチェックボックスを両方OFFにして再度「作成」ボタンをクリックした場合、下記のようにStart、Updateのメソッドが記されていないファイルが生成されます。

using UnityEngine;

namespace SampleAssembly
{
    public class Template : MonoBehaviour
    {
        private void Awake() {
            Debug.Log("Hello World!!");
        }  
    }
}

Editor拡張を用いたファイルの作成でできるようになること

前記事で紹介した方法ではC#のファイルを生成する時点でStartやUpdateを記すかどうかを指定したり、Debug.Logで動的に文字列を埋め込んだりするということはできませんでしたが、今回の方法では可能となりました。

上記のサンプルを組み合わせることでさまざまなことができると考えられます。

例えば私が所属するプロジェクトではプロジェクト内のルールに則ったファイルを今回紹介した方法を組み合わせて生成するようにしています。

自分のプロジェクトに合ったテンプレートを作成するとミスが減って便利だと考えております。

おわりに

KENTEMでは、様々な拠点でエンジニアを大募集しています! 建設×ITにご興味頂いた方は、是非下記のリンクからご応募ください。 recruit.kentem.jp career.kentem.jp