# 扇形のギズモとは?
視界や索敵範囲などを表すために扇形のギズモを用いることがよくありますが、自分の知る限りUnityの標準機能で直接扇形のオブジェクトを作り出す機能が見当たらなかったので自作しました。
# スクリプトで動的にメッシュを作り出す
完成したスクリプトの実行例。このようにインスペクターからも操作できるようになっている。スクリプトでの変形、Dotweenなどでアニメーションさせることも可能。
# メッシュとポリゴンと三角形
全てのポリゴンは三角形(三つの頂点)からなり、それが集まって形になったものをメッシュと呼ぶ。
# 新規オブジェクトを作成しコンポーネントとしてアタッチさせる
雛形のプレハブを作っても良かったのですが、空オブジェクトを作り各コンポーネントをアタッチする方法をとりました。引数で親オブジェクトを渡し、その下に各オブジェクトを作成し、必要なコンポーネントをアタッチし、作成した子オブジェクトを戻り値として返します。今後はこの子オブジェクトがギズモになります。
# 三角ポリゴンの配列からメッシュを作成する
forループが-angle/2からプラスのangle/2までなのは、左右に角度の半分づつであるため。角度は整数とは限らないのでfloat型にしている。頂点の座標は三角関数で求める。角度にはラジアン法を使う必要があるので、いちいち変換しなくてはならない。(ここでも計算で重くなりそうだ・・・)
verticesは頂点のリスト型配列。中心軸が0番で、時計回りに1から順に頂点のVector3座標が代入される。
trianglesは各三角ポリゴンの頂点を表している。前述のverticesの添え字番号が入る。1番目の三角ポリゴンの頂点は0,1,2、2番目のポリゴンは0,2,3、3番目のポリゴンは0,3,4がそれぞれ頂点となる。3つの頂点の配列をリストにして、実質メッシュの設計図としている。
# ソースコードの全体像
RefleshGizmoメソッドの中でGetComponentを使用しているのでUpdate()などの毎フレーム呼ばれるメソッドに組み込むのはおすすめ出来ません。コンポーネントを事前にキャッシュする事も出来ますが、汎用性を優先して今回はメソッド内にGetComponentを組み込みました。
テスト用のスクリプトを用意してみました。Update()内での使用は勧めないと言っておきながら使ってますけど。。。ギズモを持たせたい親オブジェクトにtest.csをアタッチして下さい。FanGizmo.csはアタッチしなくていいです。
test.csをCubeオブジェクトにアタッチしてみた例
# 最後に
正直、これはブログにするか迷いました。需要があるかは不明ですが、自身の勉強のため投稿してみました。何かのお役に立てれば幸いです。