【Unity】Unity Gizmos入門:シーンビューでデバッグ情報を視覚化する強力なツール

作成: 2026-02-05最終更新: 2026-07-13

UnityのGizmosを使ってシーンビューでデバッグ情報を視覚化する方法を解説。空のGameObject、トリガー範囲、AIの検知範囲などを表示できます。

動作確認環境: Unity 2022.3 LTS / Unity 6

「空のGameObjectがどこにあるのかわからない…」「トリガーの範囲がどこまでなのか確認したい…」「AIの検知範囲を視覚的に確認しながら調整したい…」

そこで役立つのが、Gizmos(ギズモ) です。Gizmosは、シーンビューに図形を描いてデバッグ情報を「見える化」するツールです。数値とにらめっこして調整していた検知範囲やパスが、シーンビュー上の図形として見えるようになると、調整のスピードが一気に上がります。

Gizmosのイメージ。粘土風のゲームシーンにワイヤーフレームの球や線のガイドが光って表示されている

この記事でわかること

  • OnDrawGizmosOnDrawGizmosSelectedの使い分け
  • Gizmos・Debug.Draw・Handlesの「どれで描くか」の判断基準
  • AI検知範囲・パス・トリガー範囲などの実践レシピ5選
  • 巡回・視野・攻撃範囲を1画面に描く「敵AIデバッグ表示」の組み立て方

Sponsored

Gizmosの基本的な使い方

描画の入り口は2つのイベント関数です。常に表示するか、選択したときだけ表示するかで使い分けます。

OnDrawGizmosとOnDrawGizmosSelectedの比較図。左は常時表示ですべてのオブジェクトの範囲が見え、右は選択したオブジェクトの範囲だけが表示される

OnDrawGizmos:常にGizmosを描画

using UnityEngine;

public class GizmosExample : MonoBehaviour
{
    void OnDrawGizmos()
    {
        // 黄色の球体を描画
        Gizmos.color = Color.yellow;
        Gizmos.DrawSphere(transform.position, 1.0f);
    }
}

OnDrawGizmosSelected:選択時のみGizmosを描画

void OnDrawGizmosSelected()
{
    // 赤色の球体を描画
    Gizmos.color = Color.red;
    Gizmos.DrawSphere(transform.position, 1.0f);
}

両方を組み合わせる

void OnDrawGizmos()
{
    // 通常時は緑色
    Gizmos.color = Color.green;
    Gizmos.DrawSphere(transform.position, 1.0f);
}

void OnDrawGizmosSelected()
{
    // 選択時は赤色
    Gizmos.color = Color.red;
    Gizmos.DrawSphere(transform.position, 1.0f);
}

どれで描く? Gizmos・Debug.Draw・Handles

シーンビューへ何かを描く道具は、実はGizmosだけではありません。先に「いつ・どこで見えるか」で3つを分けておくと、この後のメソッド一覧を迷わず読めます。

GizmosDebug.DrawHandles
書く場所OnDrawGizmosUpdateなど通常の処理内Editorスクリプト
見えるタイミング編集中も実行中も実行中のみ編集中(エディタ拡張)
できること図形の表示線・レイの表示(表示秒数を指定可能)ドラッグで値の編集

※ GizmosとDebug.Drawはどちらもシーンビューに表示されます。ゲームビューにも出したい場合は、ゲームビュー右上の「Gizmos」ボタンをONにします。ビルドしたゲームにはどれも表示されません。

Debug.Drawの例

void Update()
{
    // 実行中にレイを描画(赤色、1秒間表示)
    Debug.DrawRay(transform.position, transform.forward * 10f, Color.red, 1f);

    // 2点間に線を描画
    Debug.DrawLine(pointA, pointB, Color.green);
}

使い分けのコツ: 検知範囲やトリガーのように「配置・調整の段階から常に見たい」ものはGizmos、レイキャストの軌跡のように「実行した瞬間だけ確認したい」ものはDebug.Drawです。Handlesはエディタ拡張の世界なので、この記事ではおまけで触れるだけにとどめます。

Gizmosクラスの主なメソッド(リファレンス)

ここからは描画メソッドの一覧です。全部覚える必要はありません。「こんな図形が描けるのか」と眺めておいて、必要になったら戻ってくる使い方で十分です。

Gizmosの描画メソッドのギャラリー図。DrawSphere・DrawWireSphere・DrawCube・DrawWireCube・DrawLine・DrawRayで描ける図形の一覧
メソッド説明
Gizmos.color描画色を設定
Gizmos.DrawSphere球体を描画
Gizmos.DrawWireSphereワイヤーフレームの球体を描画
Gizmos.DrawCube立方体を描画
Gizmos.DrawWireCubeワイヤーフレームの立方体を描画
Gizmos.DrawLine2点間に線を描画
Gizmos.DrawRayレイを描画
Gizmos.DrawIconアイコンを描画
Gizmos.DrawMeshメッシュを描画
Gizmos.matrix変換行列を設定

使用例

// 球体を描画
Gizmos.color = Color.red;
Gizmos.DrawSphere(transform.position, 1.0f);

// ワイヤーフレームの立方体を描画
Gizmos.color = Color.yellow;
Gizmos.DrawWireCube(transform.position, new Vector3(2, 2, 2));

// 線を描画
Gizmos.color = Color.blue;
Gizmos.DrawLine(transform.position, transform.position + Vector3.forward * 5);

// レイを描画
Gizmos.DrawRay(transform.position, transform.forward * 5);

半透明の描画

アルファ値を持つColorを使うことで、半透明のGizmosを描画できます。

// 半透明の赤(アルファ0.3)
Gizmos.color = new Color(1f, 0f, 0f, 0.3f);
Gizmos.DrawSphere(transform.position, 2.0f);

// 輪郭は不透明で描画
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(transform.position, 2.0f);

塗りつぶしと輪郭を組み合わせることで、範囲が見やすくなります。

Sponsored

実践的な使用例

例1:空のGameObjectを視覚化

public class EmptyObjectGizmo : MonoBehaviour
{
    [SerializeField] private Color normalColor = Color.green;
    [SerializeField] private Color selectedColor = Color.red;
    [SerializeField] private float radius = 0.5f;

    void OnDrawGizmos()
    {
        Gizmos.color = normalColor;
        Gizmos.DrawSphere(transform.position, radius);
    }

    void OnDrawGizmosSelected()
    {
        Gizmos.color = selectedColor;
        Gizmos.DrawSphere(transform.position, radius);
    }
}

例2:トリガーの範囲を視覚化

public class TriggerGizmo : MonoBehaviour
{
    [SerializeField] private BoxCollider boxCollider;

    void OnDrawGizmos()
    {
        if (boxCollider == null) return;

        Gizmos.color = Color.green;
        Gizmos.matrix = transform.localToWorldMatrix;
        Gizmos.DrawWireCube(boxCollider.center, boxCollider.size);
    }
}

例3:AIの検知範囲を視覚化

数値だけでは掴みにくい「半径10の検知範囲」が、シーンビュー上のワイヤー球として見えるようになります。敵を配置しながらその場で範囲を調整できるのが強みです。

AI検知範囲のGizmos実例図。粘土風の敵ロボットの周囲に黄色いワイヤーフレームの球が表示され、検知範囲が一目でわかる。範囲内に入ったプレイヤーに気づいている
public class AIDetectionGizmo : MonoBehaviour
{
    [SerializeField] private float detectionRange = 10.0f;

    void OnDrawGizmos()
    {
        Gizmos.color = Color.yellow;
        Gizmos.DrawWireSphere(transform.position, detectionRange);
    }

    void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(transform.position, detectionRange);
        // 前方方向を線で表示
        Gizmos.DrawRay(transform.position, transform.forward * detectionRange);
    }
}

例4:パスを視覚化

public class PathGizmo : MonoBehaviour
{
    [SerializeField] private Transform[] waypoints;

    void OnDrawGizmos()
    {
        if (waypoints == null || waypoints.Length < 2) return;

        Gizmos.color = Color.cyan;

        // ウェイポイントを球体で表示
        foreach (var waypoint in waypoints)
        {
            if (waypoint != null)
                Gizmos.DrawSphere(waypoint.position, 0.3f);
        }

        // ウェイポイント間を線で接続
        for (int i = 0; i < waypoints.Length - 1; i++)
        {
            if (waypoints[i] != null && waypoints[i + 1] != null)
                Gizmos.DrawLine(waypoints[i].position, waypoints[i + 1].position);
        }
    }
}

例5:レイキャストのデバッグ

public class RaycastGizmo : MonoBehaviour
{
    [SerializeField] private float rayDistance = 10.0f;

    void OnDrawGizmos()
    {
        // レイキャストの方向を線で表示
        Gizmos.color = Color.red;
        Gizmos.DrawRay(transform.position, transform.forward * rayDistance);

        // ヒット位置に球体を表示
        if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, rayDistance))
        {
            Gizmos.color = Color.green;
            Gizmos.DrawSphere(hit.point, 0.2f);
        }
    }
}

パフォーマンス注意: OnDrawGizmos内でPhysics.Raycastを実行すると、大量のオブジェクトにアタッチした場合にエディタが重くなります。デバッグ用途に限定し、本番環境ではOnDrawGizmosSelected(選択時のみ実行)を使用することを推奨します。

Sponsored

Gizmosの表示・非表示

シーンビューの右上にある「Gizmos」ボタンをクリックすると、Gizmosメニューが開きます。

  • 各コンポーネントごとにGizmosの表示・非表示を設定可能
  • 「3D Icons」スライダーでGizmosのサイズを調整可能
  • シーンビューとゲームビューの両方で表示可能

Game Viewでの表示

Game Viewの右上にある「Gizmos」ボタンをオンにすると、エディタ上のGame ViewでもGizmosが表示されます。これはデバッグ時に便利です。

ビルドについて: ビルドされたゲームではOnDrawGizmosは呼び出されませんが、メソッド自体はIL(中間言語)としてビルドに含まれます。実害はほぼありませんが、厳密にビルドから除外したい場合は#if UNITY_EDITORで囲みます。

#if UNITY_EDITOR
void OnDrawGizmos()
{
    Gizmos.color = Color.yellow;
    Gizmos.DrawSphere(transform.position, 1.0f);
}
#endif

結論: 通常は#if UNITY_EDITORなしでも問題ありません。パフォーマンスにも影響しません。コードの意図を明確にしたい場合や、厳密なビルドサイズ管理が必要な場合のみ使用してください。

ベストプラクティス

  • OnDrawGizmosとOnDrawGizmosSelectedを使い分ける - 常に表示か選択時のみ表示かを適切に選択
  • 色を使い分ける - 通常時は緑、選択時は赤、警告は黄色など
  • SerializeFieldで設定を公開する - インスペクターで色やサイズを調整可能に
  • nullチェックを忘れずに - 参照がnullの場合のエラーを防止
  • Gizmos.matrixを活用する - 回転や拡大縮小されたオブジェクトに対応
[SerializeField] private BoxCollider boxCollider;
[SerializeField] private Color gizmoColor = Color.green;

void OnDrawGizmos()
{
    if (boxCollider == null) return;

    Gizmos.matrix = transform.localToWorldMatrix;
    Gizmos.color = gizmoColor;
    Gizmos.DrawWireCube(boxCollider.center, boxCollider.size);
}

実践:敵AIのデバッグ表示を1画面に組む

最後に、ここまでの描画メソッドを1つの「AIデバッグ表示」へまとめます。題材は見下ろし型アクションの巡回する敵ですが、ステルスゲームの警備員でも、タワーディフェンスの砲台でも考え方は同じです。

ポイントは、情報の性質で「いつ描くか」を分けることです。

  • 常時表示(OnDrawGizmos: 巡回ルート。敵を選択していなくても、レベル全体を俯瞰して配置を確認したい情報
  • 選択時のみ(OnDrawGizmosSelected: 検知範囲・攻撃範囲・視野角。すべての敵で常時描くと画面が渋滞する、その敵固有の情報
  • Play中だけ: 現在の目的地への線。「実際にどこへ向かっているか」という実行時の情報
敵AIデバッグ表示の完成イメージ。敵の周囲に黄色の検知範囲と赤の��攻撃範囲、床にシアンの巡回ルートが描かれ、マゼンタの目的地ラインが壁を貫いて隠れているプレイヤーへ伸びている
using UnityEngine;

public class EnemyPatrol : MonoBehaviour
{
    [Header("AIの設定")]
    [SerializeField] private Transform[] patrolPoints;
    [SerializeField] private Transform player;
    [SerializeField] private float detectionRange = 6f;
    [SerializeField] private float attackRange = 1.5f;
    [SerializeField] private float viewAngle = 90f;
    [SerializeField] private float moveSpeed = 3f;

    private int patrolIndex;
    private Vector3 currentDestination;

    void Update()
    {
        if (patrolPoints == null || patrolPoints.Length == 0) return;

        // 発見判定:距離だけで見つける(わざと視野角も壁も見ていない)
        bool playerFound = player != null &&
            Vector3.Distance(transform.position, player.position) <= detectionRange;

        currentDestination = playerFound
            ? player.position
            : patrolPoints[patrolIndex].position;

        // 目的地へ移動し、巡回点へ着いたら次の点へ
        transform.position = Vector3.MoveTowards(
            transform.position, currentDestination, moveSpeed * Time.deltaTime);

        if (!playerFound &&
            Vector3.Distance(transform.position, currentDestination) < 0.1f)
        {
            patrolIndex = (patrolIndex + 1) % patrolPoints.Length;
        }
    }

    // 常時表示:巡回ルートと、Play中の目的地
    void OnDrawGizmos()
    {
        if (patrolPoints == null || patrolPoints.Length == 0) return;

        Gizmos.color = Color.cyan;
        for (int i = 0; i < patrolPoints.Length; i++)
        {
            if (patrolPoints[i] == null) continue;
            Gizmos.DrawSphere(patrolPoints[i].position, 0.3f);

            var next = patrolPoints[(i + 1) % patrolPoints.Length];
            if (next != null)
                Gizmos.DrawLine(patrolPoints[i].position, next.position);
        }

        // Play中だけ:今どこへ向かっているか(この線がバグ発見の主役)
        if (Application.isPlaying)
        {
            Gizmos.color = Color.magenta;
            Gizmos.DrawLine(transform.position, currentDestination);
        }
    }

    // 選択時のみ:この敵固有の範囲
    void OnDrawGizmosSelected()
    {
        // 検知範囲(黄)と攻撃範囲(赤)
        Gizmos.color = Color.yellow;
        Gizmos.DrawWireSphere(transform.position, detectionRange);
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(transform.position, attackRange);

        // 「こう見えてほしい」という設計上の視野角を左右の線で描く
        Gizmos.color = Color.yellow;
        Vector3 left = Quaternion.Euler(0, -viewAngle / 2f, 0) * transform.forward;
        Vector3 right = Quaternion.Euler(0, viewAngle / 2f, 0) * transform.forward;
        Gizmos.DrawRay(transform.position, left * detectionRange);
        Gizmos.DrawRay(transform.position, right * detectionRange);
    }
}

空のGameObjectを2〜4個置いてpatrolPointsへ登録し、Playすると、敵がシアンのルートを巡回し、プレイヤーが近づくと追いかけてきます。

症状:敵が壁の向こうのプレイヤーへ走っていく

このAIでしばらく遊ぶと、プレイヤーが壁の裏に隠れているのに、敵が壁へ向かって走り続ける場面に出会います。コードとにらめっこする前に、シーンビューを見てください。

  • マゼンタの目的地ラインが 壁を貫いてプレイヤーへ刺さっている → 敵は「見えているつもり」でプレイヤーを追っている
  • 敵を選択すると、黄色の視野角ラインの 外側 にいるプレイヤーまで追っている → 視野角も判定に使われていない

つまり「発見判定が距離だけで、視野角も遮蔽物も見ていない」ことが原因だと、コードを1行も読まずに切り分けられます。これがGizmosの本領です。直し方は専用記事にまとめています。視野角と遮蔽物を含む発見判定は 敵の視野・索敵システムの作り方、壁チェックの仕組みは Physics.Raycast入門 へどうぞ。

仕上げに1つだけ、シーンビュー右上の「Gizmos」ボタンを切ってみてください。図形は消えるのに、敵は何事もなく動き続けるはずです。描くのは「見るための情報」だけで、判定はUpdateの中にある——この分離さえできていれば、インスペクターで範囲を変えれば図形は即座に追従しますし、敵を10体に増やしても画面は読みやすいままです。

おまけ:先に知っておくと良いこと

Gizmosを使いこなせるようになったら、次はこのあたりが視野に入ってきます。

  • ドラッグで値を変えられる Handles クラス: Gizmosは「表示するだけ」ですが、Handles を使うとシーンビュー上でドラッグして検知範囲を広げる——といったインタラクティブな操作が作れます。Editorフォルダに置くカスタムエディタの世界なので、エディタ拡張入門 とセットで学ぶのがおすすめです。

    機能GizmosHandles
    配置場所通常スクリプトEditorフォルダ
    インタラクション表示のみドラッグで値変更可能
    用途デバッグ表示カスタムエディタツール
  • Raycastの可視化と組み合わせる: 例5のレイキャスト可視化は、Physics.Raycastの記事 の内容と直結します。「Rayが当たらない」系のバグは、まず可視化してから直すのが最短ルートです。

  • ログと使い分ける: 位置・範囲・経路のような 空間の情報はGizmos、値の変化や処理の流れのような 時間の情報はDebug.Log が向いています。ログ側のテクニックは デバッグ手法入門 で整理しています。

まとめ

Gizmosは、シーンビューでデバッグ情報を視覚化する強力なツールです。

  • 空のGameObjectを視覚化 - 位置がわかりやすくなる
  • トリガーやコライダーの範囲を表示 - 当たり判定の確認が容易に
  • AIの検知範囲を表示 - パラメータ調整が視覚的にできる
  • パスやウェイポイントを表示 - 移動経路の確認が容易に
  • レイキャストのデバッグ - ヒット判定の視覚的確認

位置・範囲・経路のような「空間の情報」は、ログに数値を出すよりも描いた方が一目で伝わります。まずは、いま作っている敵やトリガーにOnDrawGizmosSelectedを1つ足すところから始めてみませんか?

さらに学ぶために