【Unity】Inspectorにボタンを追加する

Tips

これを作る。

前回作成したCSVファイルからデータベースにデータを追加するスクリプトにボタンを追加する。

前回のものはこちら

前回のあらすじ

CSVを読み込んでデータベース(ScriptableObject)に追加するスクリプトを作成した

けど、実行するにはゲームを再生してStart()関数を呼ばないといけない作り。

できればゲームを再生せずに上記を実行したい。

解決策

Inspectorにボタンを追加しよう

Inspectorにボタンを追加する

Inspectorにボタンを追加するには、Editorクラスを継承した拡張クラスを用意する必要がある。

MonoBehaviourを継承しているとEditorを継承できない(C#は多重継承禁止)ので、別スクリプトを作成することになる。

前回作った「CsvImportTool.cs」と同じ階層に、拡張用クラス「CsvImportEditor.cs」を作成する

CsvImportEditor.cs

using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(CsvImportTool))] // CsvImportToolを拡張する
public class CsvImportEditor : Editor
{
    public override void OnInspectorGUI()
    {
        //元のInspector部分を表示
        base.OnInspectorGUI();

        //ボタンを表示
        if (GUILayout.Button("苗字データのcsvをインポート"))
        {
            CsvImportTool csvImportTool = (CsvImportTool)target;
            csvImportTool.SetLastNameDataBaseFromCsv();
        }

        //ボタンを表示
        if (GUILayout.Button("名前データのcsvをインポート"))
        {
            CsvImportTool csvImportTool = (CsvImportTool)target;
            csvImportTool.SetFirstNameDataBaseFromCsv();
        }
    }
}

追加するのはこれだけ。

[CustomEditor(typeof(CsvImportTool))]

にて拡張するクラスを指定する。

今回は以前作成したCsvImportToolクラスを拡張するのでこの書き方。

public class CsvImportEditor : Editor

Editorクラスを継承

 public override void OnInspectorGUI()

EditorクラスのOnInspectorGUI()関数をオーバーライドしてる。

正直「これはこういうもん」って覚えておくのが良さそう

base.OnInspectorGUI();

これは拡張元クラスのInspector表示を引き継ぐようにする処理。

これがないと下図のように元クラスでInspector表示できていたものが表示されなくなってしまう。

        //ボタンを表示
        if (GUILayout.Button("苗字データのcsvをインポート"))
        {
            CsvImportTool csvImportTool = (CsvImportTool)target;
            csvImportTool.SetLastNameDataBaseFromCsv();
        }

        //ボタンを表示
        if (GUILayout.Button("名前データのcsvをインポート"))
        {
            CsvImportTool csvImportTool = (CsvImportTool)target;
            csvImportTool.SetFirstNameDataBaseFromCsv();
        }

本命のボタンを追加する処理。

GUILayout.Button(“〇〇”)でInspectorにボタンを表示させてるっぽい

押したときにTrueが返って中の処理が実行されるような感じ

〇〇はボタンに表示させるテキストになる。

あとは実行させたい関数をそれぞれのif内に書いてあげればよい。

追記(2023/12/26)

同じスクリプトファイルに書いても普通に動作した。

こっちのほうがわかりやすい気がする

using UnityEngine;
using UnityEditor;

public class CsvImportTool : MonoBehaviour
{
        // ほにゃほにゃ
}

[CustomEditor(typeof(CsvImportTool))] // CsvImportToolを拡張する
public class CsvImportEditor : Editor
{
    public override void OnInspectorGUI()
    {
        // ほにゃほにゃ
    }
}
タイトルとURLをコピーしました