MRが楽しい

MRやVRについて学習したことを書き残す

UnityのInspectorビューにエディター再生中のみ関数を実行するボタンを追加する

本日は Unity の小ネタ枠です。
UnityのInspectorビューにエディター再生中のみ関数を実行するボタンを追加する手順を記事にします。
f:id:bluebirdofoz:20210714222742j:plain

前提条件

前回記事の続きです。
bluebirdofoz.hatenablog.com

UnityEditor.EditorApplication

エディターが再生中か否かは UnityEditor.EditorApplication クラスの isPlaying 変数で取得できます。
UnityEditor.EditorApplication クラスではその他、様々な UnityEditor の情報が取得できます。
docs.unity3d.com

サンプルスクリプト

以下のサンプルスクリプトと、そのエディター拡張を行うスクリプトを作成しました。
・TestMessageScript.cs

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

/// <summary>
/// サンプルスクリプト
/// </summary>
public class TestMessageScript : MonoBehaviour
{
    /// <summary>
    /// デバッグメッセージを表示するPublic関数
    /// </summary>
    public void PublicMessageMethod(string message)
    {
        Debug.Log("PublicMessageMethod : " + message);
    }

    /// <summary>
    /// デバッグメッセージを表示するPrivate関数
    /// </summary>
    private void PrivateMessageMethod(string message)
    {
        Debug.Log("PrivateMessageMethod : " + message);
    }
}

f:id:bluebirdofoz:20210714222849j:plain

・TestMessageScriptEditor.cs

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

#if UNITY_EDITOR
using UnityEditor;

// クラス名を別名でまとめて管理する
using CUSTOMTYPE = TestMessageScript;

// 拡張するクラスを指定する
[CustomEditor(typeof(CUSTOMTYPE))]
public class TestMessageScriptEditor : Editor
{
    /// <summary>
    /// テスト入力メッセージ
    /// </summary>
    private string TestMessage;

    // GUIの表示関数をオーバーライドする
    public override void OnInspectorGUI()
    {
        // 元のインスペクター部分を表示
        base.OnInspectorGUI();

        // targetを変換して対象スクリプトの参照を取得する
        CUSTOMTYPE targetScript = target as CUSTOMTYPE;

        // Editor実行中のみ有効化なUIを設定する
        if (EditorApplication.isPlaying)
        {
            // public関数を実行するボタンの作成
            if (GUILayout.Button("PublicMessageMethodの実行"))
            {
                targetScript.PublicMessageMethod(TestMessage);
            }

            // private関数を実行するボタンの作成
            if (GUILayout.Button("PrivateMessageMethodの実行"))
            {
                targetScript.SendMessage("PrivateMessageMethod", TestMessage, SendMessageOptions.DontRequireReceiver);
            }

            // メッセージの入力テキストフィールド
            TestMessage = EditorGUILayout.TextField("Message", TestMessage);
        }
    }
}
#endif

f:id:bluebirdofoz:20210714222905j:plain

シーンの適当なオブジェクトにサンプルスクリプトを設定します。
f:id:bluebirdofoz:20210714222927j:plain

動作確認

シーンを再生するため、Unity エディターの[再生]ボタンをクリックします。
f:id:bluebirdofoz:20210714222939j:plain

シーンが再生されると、Inspectro ビューに関数を実行する拡張UIが表示されました。
f:id:bluebirdofoz:20210714222949j:plain

これによりシーンを再生中にのみ、関数実行を試すことができます。
f:id:bluebirdofoz:20210714223001j:plain