読者です 読者をやめる 読者になる 読者になる

テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】CullingGroupで視界内にある座標から敵を生成しないようにする

CullingGroupの使用例で、敵がプレイヤーの視界内にある場合は生成しないアプローチについてです。
視界内から常に敵が生成されるのであれば、敵の出現ポイントを見極められてしまったり、最悪置き撃ちされてスコアを稼がれてしまいます。それを防ぎます。

f:id:tsubaki_t1:20160110023319g:plain

使用する機能と流れ

CullingGroupを使う訳ですが、今回はCullingGroup.IsVisibleを使用します。
onStateChangedコールバックを元に見えてない生成ポイントリストを管理した方が計算回数が少ないような気がしますが、毎回計算した方が作るのが楽だったので、そちらを採用します。

大雑把な処理の流れとしては、下のような形です。

  1. 見えてる生成ポイントをリスト化
  2. リストの中からランダムで生成ポイントを設定
  3. 敵を生成
  4. 0.5秒待つ

実際に作ってみる

ステージと敵の生成ポイントを設定します。

生成ポイントは位置調整が面倒くさいのでGameobjectのTransformを使用します。この際、オブジェクトにアイコンを付けて置くと見つけるのが楽です。
f:id:tsubaki_t1:20160110030816j:plain

可視判定にOcclusionCullingを使用したいので、ステージをstaticに設定して、OcclusionCullingを焼きます。

UnityのOcclusion Cullingの機能を使って3D空間を効率的に描画する

f:id:tsubaki_t1:20160110032209j:plain

敵を生成する処理に「視界外ならば生成する」の処理を追加します。上で書いたように、CullingGroupのIsVisibleがfalseの座標を集める訳です。

gist.github.com

あとはTargetPositionに敵を生成するGameObject、SpawnPrefabに生成する敵を設定すれば完了です。

f:id:tsubaki_t1:20160110032959j:plain

サンプルプロジェクト

今回はサンプルプロジェクトを公開してみます。

github.com

アセットとしてシネマティックイメージエフェクトを使用しています。足りないAssetを一覧化してインポートする仕組みを入れてるので設定は楽だと思いますが一応。

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp