動作確認環境: Unity 6 (6000.x)
「空のGameObjectがどこにあるのかわからない…」「トリガーの範囲がどこまでなのか確認したい…」「AIの検知範囲を視覚的に確認しながら調整したい…」
そこで役立つのが、Gizmos(ギズモ) です。Gizmosは、シーンビューに図形を描いてデバッグ情報を「見える化」するツールです。数値とにらめっこして調整していた検知範囲やパスが、シーンビュー上の図形として見えるようになると 、調整のスピードが一気に上がります。
この記事でわかること
OnDrawGizmosとOnDrawGizmosSelectedの使い分け- Gizmos・
Debug.Draw・Handlesの「どれで描くか」の判断基準- AI検知範囲・パス・トリガー範囲などの実践レシピ5選
- 巡回・視野・攻撃範囲を1画面に描く「敵AIデバッグ表示」の組み立て方
Gizmosの基本的な使い方
描画の入り口は2つのイベント関数です。常に表示するか、選択したときだけ表示するかで使い分けます。

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つを分けておくと、この後のメソッド一覧を迷わず読めます。
| Gizmos | Debug.Draw | Handles | |
|---|---|---|---|
| 書く場所 | OnDrawGizmos系 | Updateなど通常の処理内 | 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.color | 描画色を設定 |
Gizmos.DrawSphere | 球体を描画 |
Gizmos.DrawWireSphere | ワイヤーフレームの球体を描画 |
Gizmos.DrawCube | 立方体を描画 |
Gizmos.DrawWireCube | ワイヤーフレームの立方体を描画 |
Gizmos.DrawLine | 2点間に線を描画 |
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);
DrawLineの2つ目は「終点の座標」、DrawRayの2つ目は「向き×長さ」です。取り違えると、線が原点のほうへ飛んでいったり、思わぬ長さになったりします。
半透明の描画
アルファ値を持つ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);
塗りつぶしと輪郭を組み合わせることで、範囲が見やすくなります。
実践的な使用例
例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の検知範囲」が、シーンビュー上のワイヤー球として見えるようになります。敵を配置しながらその場で範囲を調整できるのが強みです。

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(選択時のみ実行)を使用することを推奨します。
Gizmosの表示・非表示
シーンビューの右上にある「Gizmos」ボタンをクリックすると、Gizmosメニューが開きます。
- 各コンポーネントごとにGizmosの表示・非表示を設定可能
- 「3D Icons」スライダーでGizmosのサイズを調整可能
- シーンビューとゲームビューの両方で表示可能
Game Viewでの表示
Game Viewの右上にある「Gizmos」ボタンをオンにすると、エディタ上のGame ViewでもGizmosが表示されます。これはデバッグ時に便利です。
ビルドについて: ビルドされたゲームでは
OnDrawGizmosは呼び出されませんが、#if UNITY_EDITORで囲まない限り、メソッド自体はビルドするコードに残ります。呼ばれないので実害はほぼありませんが、厳密にビルドから除外したい場合は#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中だけ: 現在の目的地への線。「実際にどこへ向かっているか」という実行時の情報

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へ登録し、playerにプレイヤーを入れてPlayすると、敵がシアンのルートを巡回し、プレイヤーが近づくと追いかけてきます。
症状:敵が壁の向こうのプレイヤーへ走っていく
このAIでしばらく遊ぶと、プレイヤーが壁の裏に隠れているのに、敵が壁へ向かって走り続ける場面に出会います。コードとにらめっこする前に、シーンビューを見てください。
- マゼンタの目的地ラインが 壁を貫いてプレイヤーへ刺さっている → 敵は「見えているつもり」でプレイヤーを追っている
- 敵を選択すると、黄色の視野角ラインの 外側 にいるプレイヤーまで追っている → 視野角も判定に使われていない
つまり「発見判定が距離だけで、視野角も遮蔽物も見ていない」ことが原因だと、コードを1行も読まずに切り分けられます。これがGizmosの本領です。直し方は専用記事にまとめています。視野角と遮蔽物を含む発見判定は 敵の視野・索敵システムの作り方、壁チェックの仕組みは Physics.Raycast入門 へどうぞ。
仕上げに1つだけ、シーンビュー右上の「Gizmos」ボタンを切ってみてください。図形は消えるのに、敵は何事もなく動き続けるはずです。描くのは「見るための情報」だけで、判定はUpdateの中にある——この分離さえできていれば、インスペクターで範囲を変えれば図形は即座に追従しますし、敵を10体に増やしても画面は読みやすいままです。
おまけ:先に知っておくと良いこと
Gizmosを使いこなせるようになったら、次はこのあたりが視野に入ってきます。
-
ドラッグで値を変えられる
Handlesクラス: Gizmosは「表示するだけ」ですが、Handles を使うとシーンビュー上でドラッグして検知範囲を広げる——といったインタラクティブな操作が作れます。Editorフォルダに置くカスタムエディタの世界なので、エディタ拡張入門 とセットで学ぶのがおすすめです。機能 Gizmos Handles 配置場所 通常スクリプト Editorフォルダ インタラクション 表示のみ ドラッグで値変更可能 用途 デバッグ表示 カスタムエディタツール -
Raycastの可視化と組み合わせる: 例5のレイキャスト可視化は、Physics.Raycastの記事 の内容と直結します。「Rayが当たらない」系のバグは、まず可視化してから直すのが最短ルートです。
-
ログと使い分ける: 位置・範囲・経路のような 空間の情報はGizmos、値の変化や処理の流れのような 時間の情報は
Debug.Logが向いています。ログ側のテクニックは デバッグ手法入門 で整理しています。
まとめ
Gizmosは、シーンビューでデバッグ情報を視覚化する強力なツールです。
- 空のGameObjectを視覚化 - 位置がわかりやすくなる
- トリガーやコライダーの範囲を表示 - 当たり判定の確認が容易に
- AIの検知範囲を表示 - パラメータ調整が視覚的にできる
- パスやウェイポイントを表示 - 移動経路の確認が容易に
- レイキャストのデバッグ - ヒット判定の視覚的確認
位置・範囲・経路のような「空間の情報」は、ログに数値を出すよりも描いた方が一目で伝わります。まずは、いま作っている敵やトリガーにOnDrawGizmosSelectedを1つ足すところから始めてみませんか?