概要
動作確認環境: Unity 2022.3 LTS / Unity 6
「空のGameObjectがどこにあるのかわからない…」「トリガーの範囲がどこまでなのか確認したい…」「AIの検知範囲を視覚的に確認しながら調整したい…」
そこで役立つのが、Gizmos(ギズモ) です。Gizmosは、シーンビューでデバッグ情報を視覚化する強力なツールです。シーンビューでのみ表示され、ビルドには含まれません。
Gizmosの基本的な使い方
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クラスの主なメソッド
| メソッド | 説明 |
|---|---|
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);
塗りつぶしと輪郭を組み合わせることで、範囲が見やすくなります。
GizmosとDebug.Drawの使い分け
| 機能 | Gizmos | Debug.Draw |
|---|---|---|
| 呼び出し場所 | OnDrawGizmos / OnDrawGizmosSelected | Update / FixedUpdate など |
| 用途 | エディタでの設計・調整 | 実行時のデバッグ |
| 表示タイミング | 常時(編集中も) | 実行中のみ |
| 持続時間 | 毎フレーム描画 | duration指定可能 |
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を使います。
実践的な使用例
例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の検知範囲を視覚化
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なしでも問題ありません。パフォーマンスにも影響しません。コードの意図を明確にしたい場合や、厳密なビルドサイズ管理が必要な場合のみ使用してください。
次のステップ:Handlesクラス
より高度なシーンビュー描画には Handles クラスがあります。
| 機能 | Gizmos | Handles |
|---|---|---|
| 配置場所 | 通常スクリプト | Editorフォルダ |
| インタラクション | 表示のみ | ドラッグで値変更可能 |
| 用途 | デバッグ表示 | カスタムエディタツール |
Handlesを使うと、シーンビュー上でドラッグして範囲を調整するなどのインタラクティブな操作が実装できます。Gizmosに慣れたら、次のステップとしてHandlesを学ぶことをお勧めします。
ベストプラクティス
- 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);
}
まとめ
Gizmosは、シーンビューでデバッグ情報を視覚化する強力なツールです。
- 空のGameObjectを視覚化 - 位置がわかりやすくなる
- トリガーやコライダーの範囲を表示 - 当たり判定の確認が容易に
- AIの検知範囲を表示 - パラメータ調整が視覚的にできる
- パスやウェイポイントを表示 - 移動経路の確認が容易に
- レイキャストのデバッグ - ヒット判定の視覚的確認
ぜひ、Gizmosを活用して、効率的にデバッグしてください。