OnDrawGizmosについて
OnDrawGizmosは、Unityエディタ上でシーンの視覚的なデバッグや補助情報を表示するためのツールです。これにより、開発中にオブジェクトの範囲、経路、位置関係などを直感的に把握することができます。
1. Gizmosとは?
Gizmosは、Unityエディタ内でオブジェクトの状態や関係を視覚的に表現するためのグラフィカル要素です。これらはゲームの実行時には表示されず、あくまでエディタ上でのみ表示されます。主な用途は以下の通りです:
- オブジェクトの範囲やサイズの確認
- ナビゲーションポイントやウェイポイントの表示
- レイキャストやセンサーの視覚化
- デバッグ情報の表示
2. OnDrawGizmosとOnDrawGizmosSelectedの違い
OnDrawGizmos: オブジェクトが選択されていなくても常に実行され、Gizmosを描画します。OnDrawGizmosSelected: オブジェクトがエディタ上で選択されている場合にのみ実行され、Gizmosを描画します。
これにより、必要に応じて情報の表示範囲を制御することができます。
3. OnDrawGizmosの基本的な使用方法
3.1. 基本的な構造
using UnityEngine;
public class GizmoExample : MonoBehaviour
{
void OnDrawGizmos()
{
// Gizmosの色を設定
Gizmos.color = Color.red;
// オブジェクトの位置に球を描画
Gizmos.DrawSphere(transform.position, 1f);
}
}
3.2. 実際の例: レイキャストの視覚化
先ほどのRaycastExample1にOnDrawGizmosを追加して、レイキャストをエディタ上で視覚化する方法を紹介します。
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内で、レイキャストの方向と距離を黄色のレイとして描画します。- レイがヒットした場合、そのヒットポイントに赤い球を描画します。
lastHit変数を使用して、最後にヒットした情報を保持し、OnDrawGizmosで使用しています。
注意: 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);
}
}
結果:
- 青い線がオブジェクトの位置から上方向に5ユニット描画されます。
- 緑色のワイヤーフレームの球が線の終点に描画されます。
- 赤色の塗りつぶされた球がさらに上に描画されます。
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);
}
}
}