CullingGroupの使用例で、敵がプレイヤーの視界内にある場合は生成しないアプローチについてです。
視界内から常に敵が生成されるのであれば、敵の出現ポイントを見極められてしまったり、最悪置き撃ちされてスコアを稼がれてしまいます。それを防ぎます。
使用する機能と流れ
CullingGroupを使う訳ですが、今回はCullingGroup.IsVisibleを使用します。
onStateChangedコールバックを元に見えてない生成ポイントリストを管理した方が計算回数が少ないような気がしますが、毎回計算した方が作るのが楽だったので、そちらを採用します。
大雑把な処理の流れとしては、下のような形です。
- 見えてる生成ポイントをリスト化
- リストの中からランダムで生成ポイントを設定
- 敵を生成
- 0.5秒待つ
実際に作ってみる
ステージと敵の生成ポイントを設定します。
生成ポイントは位置調整が面倒くさいのでGameobjectのTransformを使用します。この際、オブジェクトにアイコンを付けて置くと見つけるのが楽です。
可視判定にOcclusionCullingを使用したいので、ステージをstaticに設定して、OcclusionCullingを焼きます。
UnityのOcclusion Cullingの機能を使って3D空間を効率的に描画する
敵を生成する処理に「視界外ならば生成する」の処理を追加します。上で書いたように、CullingGroupのIsVisibleがfalseの座標を集める訳です。
あとはTargetPositionに敵を生成するGameObject、SpawnPrefabに生成する敵を設定すれば完了です。
サンプルプロジェクト
今回はサンプルプロジェクトを公開してみます。
アセットとしてシネマティックイメージエフェクトを使用しています。足りないAssetを一覧化してインポートする仕組みを入れてるので設定は楽だと思いますが一応。