🪟
【Unity】自分用EditorWindowのすすめ
はじめに
ゲーム開発をしていると、バグの調査や挙動のチェックをするために使い捨てのコードを埋め込むことがあると思います。
例えば...
- 特定の処理に無理やり入るためにbool変数を定義して挙動を切り替えるようにしたり
- 時短のために既存のボタンのコールバックにショートカット遷移を登録してみたり
- 標準機能の関数の挙動を把握するためにテストコードを書いてみたり
そういった時に、いつも「どこに書こう」と少し悩むことがあったのですが、自分用のEditorWindowを定義しておくと結構捗ったので紹介します。
こんなヤツ
MyDebugWindow.cs
#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
public class MyDebugWindow : EditorWindow
{
// 別スクリプトから設定値を参照できるように公開する
public static DebugProps Props { get; private set; }
[System.Serializable]
public class DebugProps
{
public bool IsHoge; // 何かしらのON/OFFフラグ
public GameObject TrackingObject; // 特定のゲームオブジェクトの監視用
}
[SerializeField] private DebugProps m_Props = null;
private SerializedObject m_SerializedObject = null;
[MenuItem("Tools/MyDebugWindow")]
private static void Open()
{
GetWindow<MyDebugWindow>();
}
private void OnEnable()
{
Props = m_Props;
m_SerializedObject = new SerializedObject(this);
}
private void Update()
{
Repaint(); // 毎フレーム内容が更新されるようにする
}
private void OnGUI()
{
m_SerializedObject.Update();
// プロパティを表示して編集可能にする
EditorGUILayout.PropertyField(m_SerializedObject.FindProperty($"{nameof(m_Props)}"));
m_SerializedObject.ApplyModifiedProperties();
// クリックで特定の処理を実行させてみたり...
if (GUILayout.Button("Hoge"))
{
// 選択中のオブジェクト情報をログに出す
var rectTransform = Selection.activeGameObject?.GetComponent<RectTransform>();
if (rectTransform != null)
{
Debug.Log($"rect:{rectTransform.rect}");
}
}
// readonlyなプロパティ表示で監視オブジェクトの情報を出してみたり...
using (new EditorGUI.DisabledScope(disabled: true))
{
if (m_Props.TrackingObject != null)
{
EditorGUILayout.Vector3Field("pos", m_Props.TrackingObject.transform.position);
}
}
}
}
#endif
これで、上部のメニューから Tools > MyDebugWindow を選択してWindowを開くことができます。
常に表示されるようにドッキングしておくと便利です。
こうしておくと追加場所に悩むことなくサクっと確認用の処理を追加することができるのでオススメです!
Discussion