動作確認環境: Unity 2022.3 LTS / Unity 6
「空の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);
半透明の描画
アルファ値を持つ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は呼び出されませんが、メソッド自体は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中だけ: 現在の目的地への線。「実際にどこへ向かっているか」という実行時の情報
