【Unity】OnDrawGizmosで3D空間に扇状の範囲を描く

gizmos.png

 🔍敵の視界に入ったときだけ反応させたい!Vector3.Angleで実現するというエントリーで、敵に視野を設定して、検知用コリジョンに侵入しても視界の外であれば反応させない、という視界検知の方法を紹介しました。そのエントリーの最後で敵の視界を視覚的に見せるために、3D空間上の範囲に色を塗りました。今回はその方法を紹介します。

OnDrawGizmosで3D空間に扇状の範囲を描く

  1. 実装方法
  2. 他の描画方法は?

実装方法

今回は敵の視界範囲を表示したいので、敵に紐付いている EnemyMove.cs に記述します。
EnemyMove.cs については過去2回のエントリーを参照して下さい。

このエントリーで、敵キャラに近づくと自キャラを追跡するようにしました。

次のエントリーでは、敵キャラの視界に入ったときのみ感知するようにしました。

using UnityEditor;
今回はエディター上で表示したいので、この名前空間を宣言します。
    [SerializeField] private SphereCollider searchArea;
Class内で上記を定義します。
これには範囲を表示したいコライダーを入れます。
設定は後ほど。
#if UNITY_EDITOR
private void OnDrawGizmos()
{
Handles.color = Color.red;
Handles.DrawSolidArc(transform.position, Vector3.up, Quaternion.Euler(0f, - searchAngle, 0f) * transform.forward, searchAngle * 2f, searchArea.radius);
}
#endif
Unityエディター上でのみ動作するように #IF を付けています。もちろん #IF を取り払えばゲーム中にも表示されます。
color で色を指定しています。
DrawSolidArc() は扇を描画する関数です。
 第1引数:円の中心=敵キャラ自身の座標を指定。
 第2引数:円の法線=上方向を指定。
 第3引数:基点方向=敵キャラの正面を指定。
 第4引数:扇の角度=片側の角度(searchAngle)を指定。
 第5引数:円の大きさ=コライダー(searchArea)を指定。

このままだとエディター上で無限にエラーが表示されますので、searchAreaを指定する必要があります。

まず、EnemyMove.cs をアタッチしている敵キャラを選択します。
Inspector上でEnemyMove.csを確認すると、searchArea の項目があります。
ここに、敵キャラの検知用コライダー(CollisionDetector) をドラッグ&ドロップします。

gizmo1.png

これで完成です。
Unityエディター上で視界範囲が表示されます。

angle2.png

他の描画方法は?

先程はOnDrawGizmos内で描画していましたが、もちろんゲーム中でも様々なものを描画できます。サンプル画像をクリックするとリファレンスに飛びますので、興味のある関数があれば参照してみて下さい。

・DrawAAPolyLine
DrawAAPolyLine.png
中継ポイントのリストを渡すことで、それらを繋いだ線を描画します。


・DrawBezier
DrawBezier.png
指定した接線と始点と終点を通るテクスチャベジェ曲線を描画します。FF14のターゲットラインみたいなものが描けます。


・DrawDottedLine
DrawDottedLine.png
始点と終点と点線の幅を指定するだけで、点線を描画してくれます。とっても簡単です。


・DrawSolidDisc
DrawSolidDisc.png
中心点、法線、半径を指定すると、円を描画できます。攻撃範囲の予兆表示などに応用できると思います。


・DrawWireArc
DrawWireArc.png
中心、法線、方向、角度、半径を指定して、円弧を描きます。


・DrawWireDisc
DrawWireDisc.png
DrawSolidDisc()に似ていますが、こちらは円のアウトラインを描画します。


この他にもいくつか関数がありますが、この辺りを押さえておけば大体描画できると思います。


ゲームのアンテナ