【Unity】カスタムエディターでインスペクターにデバッグ用ボタンを表示する方法

スポンサーリンク
カスタムエディタ Unity
スポンサーリンク

前書き

ゲーム開発をしていると、テストプレイの効率を上げたい場面に出会います。
「特定のイベントをすぐ確認したい」「キャラクターの状態を強制的に変えたい」など、わざわざプレイして条件を満たすのは手間がかかります。

そんなときに便利なのが カスタムエディターを使ったデバッグボタンです。
インスペクターにボタンを追加しておけば、クリック一つで任意の処理を呼び出せるため、デバッグ効率が飛躍的に向上します。

今回はそんな、ゲーム開発に役立つ「カスタムエディターでデバッグ用ボタンを表示する方法」について解説していこうと思います。

カスタムエディターを使う流れ

カスタムエディターでデバッグボタンを作る流れは次のとおりです。

  1. 通常のスクリプト(MonoBehaviour)を作成
  2. そのスクリプトを編集する「エディタースクリプト」を作成

ポイントは、エディタースクリプトを Editorフォルダ に置くことです。
そうすることで、ビルドには含まれず、開発中のみ有効になります。

Editorフォルダ

通常スクリプトとカスタムエディターの関係

カスタムエディターを使う場合は、通常のスクリプト(MonoBehaviour など)カスタムエディターのスクリプト の2つ作成し、組み合わせて使います。

① 通常スクリプト(対象クラス)

  • 実際に呼び出したい処理(関数)をここに書きます。
  • 例:体力をリセットする関数、敵を強制的に出現させる関数など。
    今回はステージクリアフラグが有効になるような実装を参考例としています。
using UnityEngine;

public class StageClearActivator : MonoBehaviour
{
    /// <summary>
    /// デバッグ用:全ステージをクリア済みにしてオブジェクトを表示/非表示
    /// </summary>
    [ContextMenu("Debug/全ステージ解放表示")]
    public void DebugUnlockAllStagesRuntime()
    {
        Debug.Log("=== Debug: 全ステージ解放表示 ===");

        // 全ステージをクリア状態に
        foreach (var rule in activationRules)
        {
            GameManager.Instance.SetStageClearFlag(rule.stageIndex);
        }

        // オブジェクト表示を更新
        ApplyActivationRules();
    }
}

② カスタムエディター

次に、インスペクターにボタンを追加するカスタムエディターを作成します。
このスクリプトはEditorフォルダ に配置し、UnityEditor名前空間を使って実装します。

using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(StageClearActivator))]
public class StageClearActivatorEditor : Editor
{
    public override void OnInspectorGUI()
    {
        // デフォルトのInspectorを描画
        DrawDefaultInspector();

        // 対象のスクリプトを取得
        StageClearActivator activator = (StageClearActivator)target;

        EditorGUILayout.Space();

        // ボタンを表示
        if (GUILayout.Button("全ステージ解放表示 (Debug)"))
        {
            // 通常スクリプトの関数を呼び出し
            activator.DebugUnlockAllStagesRuntime();
        }
    }
}

コードの説明

[CustomEditor(typeof(StageClearActivator))]

このカスタムエディターが どのスクリプト用のInspectorを拡張するのかを指定しています。
ここではStageClearActivatorを対象にしているので、Unityエディターで StageClearActivator をアタッチしたオブジェクトを選択すると、このカスタムInspectorが表示されます。

public override void OnInspectorGUI()

Inspectorの表示を自由にカスタマイズするためのメソッドです。
この中で、Inspectorの描画追加のボタン処理 を書きます。

DrawDefaultInspector();

Unityが自動的に表示してくれる通常のInspectorをそのまま描画します。
これを入れないと、元々の変数や設定項目(例:publicフィールドや[SerializeField]の値)が見えなくなり、ボタンだけのInspectorになってしまいます

DrawDefaultInspectorを消すと以下のようにボタンだけが表示されてしまいます。

DrawDefaultInspectorを消した場合

StageClearActivator activator = (StageClearActivator)target;

対象となるスクリプト(ここでは StageClearActivator)のインスタンスを取得します。
target は「このカスタムエディターがアタッチされているオブジェクト」を指しており、それをキャストして使います。この変数を通じて、通常スクリプトの関数を呼び出すことができます。

EditorGUILayout.Space();

Inspectorに余白を入れて見やすくします。
デフォルトの項目とデバッグ用ボタンがくっついてしまわないようにしています。

  • EditorGUILayout.Spaceを消した場合
EditorGUILayout.Spaceを消した場合
  • EditorGUILayout.Spaceがある場合
EditorGUILayout.Spaceがある場合

実行結果

上記のスクリプトを設定すると、GameManagerに設定されたステージクリアフラグがすべてTrueに設定されるようになります。その時の動画が以下になります。

StageClearActivatorスクリプトにカスタムエディタで設定した「全ステージ解放表示 (Debug)ボタン」がちゃんと表示されていることが分かりますね。このボタンを押すことでステージ解放(ビックリマークの表示)がされるようになります。

応用例

カスタムエディターのデバッグボタンは、さまざまな場面で活用できます。

  • 敵キャラクターをスポーンする
  • インベントリにアイテムを追加する
  • ゲーム進行度をスキップする
  • セーブデータを削除する

といったテストプレイの効率化に役立ちます。
「この状態をすぐ再現したい!」という時にとても便利です。

注意点

  • カスタムエディターのスクリプトは必ず Editorフォルダ に配置する(ビルドには含まれない)

Unityではエディター専用のクラス(UnityEditor 名前空間を使うクラス)がビルドに含まれるとエラーになります。そのため、カスタムエディターを記述したスクリプトは Editor フォルダ に置いて、ゲーム本体のコードと分離する必要があります。こうすることで、実際のビルドには含まれず、開発中のみ有効になります。

  • 間違えて通常のフォルダに置いた場合

Build を行った際に「UnityEditor名前空間が見つからない」というエラーが発生し、ビルドに失敗します。さらに、ランタイムでは利用できないクラスを参照してしまうため、エディター上では動作しても、ビルド環境ではクラッシュやコンパイルエラーの原因になります。そのため、必ず Editor フォルダを作り、そこにまとめて管理する必要があります。

まとめ

  • カスタムエディターを使えば、インスペクターにボタンを追加できる
  • デバッグボタンから関数を呼び出すことで、テスト効率を大幅に改善できる

複雑なシステムを扱う場合、こうした小さな工夫が開発スピードを大きく左右します。一度仕組みを覚えてしまえば、任意の処理をワンクリックで試せるようになるのでとても便利です。

ぜひ自分のプロジェクトにも取り入れて、デバッグ作業を快適にしてみましょう!

コメント

タイトルとURLをコピーしました