Unity_Lesson

OnDrawGizmosについて

OnDrawGizmosは、Unityエディタ上でシーンの視覚的なデバッグや補助情報を表示するためのツールです。これにより、開発中にオブジェクトの範囲、経路、位置関係などを直感的に把握することができます。




1. Gizmosとは?

Gizmosは、Unityエディタ内でオブジェクトの状態や関係を視覚的に表現するためのグラフィカル要素です。これらはゲームの実行時には表示されず、あくまでエディタ上でのみ表示されます。主な用途は以下の通りです:




2. OnDrawGizmosOnDrawGizmosSelectedの違い

これにより、必要に応じて情報の表示範囲を制御することができます。




3. OnDrawGizmosの基本的な使用方法

3.1. 基本的な構造

using UnityEngine;

public class GizmoExample : MonoBehaviour
{
    void OnDrawGizmos()
    {
        // Gizmosの色を設定
        Gizmos.color = Color.red;
        
        // オブジェクトの位置に球を描画
        Gizmos.DrawSphere(transform.position, 1f);
    }
}

3.2. 実際の例: レイキャストの視覚化

先ほどのRaycastExample1OnDrawGizmosを追加して、レイキャストをエディタ上で視覚化する方法を紹介します。

using UnityEngine;

namespace RaySample
{
    public class RaycastExample1 : MonoBehaviour
    {
        public float rayDistance = 10f;
        public ParticleSystem hitEffect; // ヒットエフェクト用のパーティクルシステムプレハブ

        private RaycastHit lastHit;

        void Update()
        {
            // レイを前方に発射
            Ray ray = new Ray(transform.position, transform.forward);
            RaycastHit hit;

            if (Physics.Raycast(ray, out hit, rayDistance))
            {
                Debug.Log("Hit object: " + hit.collider.name);

                // ヒットした点でエフェクトを表示
                if (hitEffect != null)
                {
                    Instantiate(hitEffect, hit.point, Quaternion.LookRotation(hit.normal));
                }

                // 最後のヒット情報を保存
                lastHit = hit;

                // デバッグ用のレイを赤で表示
                Debug.DrawRay(ray.origin, ray.direction * hit.distance, Color.red);
            }
            else
            {
                // ヒットしなかった場合のデバッグ用のレイを緑で表示
                Debug.DrawRay(ray.origin, ray.direction * rayDistance, Color.green);
            }
        }

        void OnDrawGizmos()
        {
            Gizmos.color = Color.yellow;

            // レイを視覚化
            Gizmos.DrawRay(transform.position, transform.forward * rayDistance);

            // ヒットした点に球を描画
            if (lastHit.collider != null)
            {
                Gizmos.color = Color.red;
                Gizmos.DrawSphere(lastHit.point, 0.2f);
            }
        }
    }
}

解説:

注意: OnDrawGizmosはゲームの実行中にもエディタ上で表示されますが、ゲームプレイ中のビルド版には影響しません。




4. Gizmosの描画方法

Unityでは、Gizmosクラスを使用してさまざまな形状を描画できます。以下に主要なメソッドを紹介します。

4.1. 基本的な描画メソッド

メソッド 説明
Gizmos.DrawLine 2点間に線を描画します。
Gizmos.DrawWireSphere ワイヤーフレームの球を描画します。
Gizmos.DrawSphere 塗りつぶされた球を描画します。
Gizmos.DrawWireCube ワイヤーフレームの立方体を描画します。
Gizmos.DrawCube 塗りつぶされた立方体を描画します。
Gizmos.DrawRay レイ(線分)を描画します。
Gizmos.DrawIcon 指定した位置にアイコンを描画します。
Gizmos.DrawFrustum 視錐台(カメラの視野など)を描画します。

4.2. 具体的な描画例

4.2.1. 線と球の描画

using UnityEngine;

public class GizmoShapesExample : MonoBehaviour
{
    void OnDrawGizmos()
    {
        // 線を描画
        Gizmos.color = Color.blue;
        Gizmos.DrawLine(transform.position, transform.position + Vector3.up * 5);

        // ワイヤーフレームの球を描画
        Gizmos.color = Color.green;
        Gizmos.DrawWireSphere(transform.position + Vector3.up * 5, 1f);

        // 塗りつぶされた球を描画
        Gizmos.color = Color.red;
        Gizmos.DrawSphere(transform.position + Vector3.up * 7, 0.5f);
    }
}

結果:


4.2.2. アイコンの描画

Unityでは、エディタ用のカスタムアイコンをオブジェクトに描画することもできます。

using UnityEngine;

public class GizmoIconExample : MonoBehaviour
{
    public Texture2D iconTexture;

    void OnDrawGizmos()
    {
        if (iconTexture != null)
        {
            Gizmos.DrawIcon(transform.position, "CustomIcon.png", true);
        }
    }
}

注意点:


4.2.3. カスタム視錐台の描画

using UnityEngine;

public class GizmoFrustumExample : MonoBehaviour
{
    void OnDrawGizmos()
    {
        Matrix4x4 oldMatrix = Gizmos.matrix;

        // オブジェクトの位置と回転を基準にする
        Gizmos.matrix = transform.localToWorldMatrix;

        Gizmos.color = new Color(1, 0, 0, 0.1f);
        Gizmos.DrawFrustum(Vector3.zero, 60, 10, 1, 1.777f); // 視錐台を描画

        Gizmos.matrix = oldMatrix;
    }
}

解説:




5. OnDrawGizmosSelectedの使用例

OnDrawGizmosSelectedを使用すると、オブジェクトが選択されているときだけGizmosを描画できます。これにより、不要な描画を避け、エディタの視認性を向上させることができます。

using UnityEngine;

public class GizmoSelectedExample : MonoBehaviour
{
    void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.cyan;
        Gizmos.DrawWireCube(transform.position, Vector3.one * 2);
    }
}

結果:




6. 実践的な応用例

6.1. センサー範囲の視覚化

例えば、敵キャラクターがプレイヤーを検知する範囲(視界や追跡範囲)をGizmosで表示することができます。

using UnityEngine;

public class EnemySensor : MonoBehaviour
{
    public float viewRadius = 10f;
    [Range(0, 360)]
    public float viewAngle = 90f;

    void OnDrawGizmos()
    {
        // 視界の範囲を円で描画
        Gizmos.color = new Color(1, 0, 0, 0.2f); // 半透明の赤
        Gizmos.DrawSphere(transform.position, viewRadius);

        // 視角を示す線を描画
        Vector3 leftBoundary = Quaternion.Euler(0, -viewAngle / 2, 0) * transform.forward * viewRadius;
        Vector3 rightBoundary = Quaternion.Euler(0, viewAngle / 2, 0) * transform.forward * viewRadius;

        Gizmos.color = Color.red;
        Gizmos.DrawRay(transform.position, leftBoundary);
        Gizmos.DrawRay(transform.position, rightBoundary);
    }
}

解説:

6.2. ウェイポイントの経路表示

複数のウェイポイントを持つオブジェクトの移動経路をGizmosで表示することも可能です。

using UnityEngine;

public class WaypointPath : MonoBehaviour
{
    public Transform[] waypoints;

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

        Gizmos.color = Color.green;
        for (int i = 0; i < waypoints.Length - 1; i++)
        {
            Gizmos.DrawLine(waypoints[i].position, waypoints[i + 1].position);
        }

        // 最後のウェイポイントと最初のウェイポイントを繋げる(ループ)
        Gizmos.DrawLine(waypoints[waypoints.Length - 1].position, waypoints[0].position);
    }
}

解説:


7. ベストプラクティス


8. まとめ

OnDrawGizmosOnDrawGizmosSelectedは、Unityエディタ内でオブジェクトの状態や関係を視覚的にデバッグ・補助するための非常に有用なツールです。これらを活用することで、開発効率を大幅に向上させることができます。以下に主要なポイントをまとめます:

これらの機能を効果的に活用し、より洗練された開発体験を実現してください。