テラシュールブログ

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

【Unity】キャラクターやギミックが見える位置になったらオブジェクトを生成する

シーンに全てのオブジェクトやギミックを追加し一気に読み込むと、実際に操作可能になるまでに時間がかかります。
そこで、ステージやキャラクターといった「遊びに必要な要素」は先に読込み、それ以外のNPCや遠方のモデルは追加で読み込むアプローチが思いつきます。

f:id:tsubaki_t1:20160111112450j:plain

f:id:tsubaki_t1:20160111112456j:plain

この追加ロードのタイミングですが、「ステージのロード後」や「特定の位置(範囲)に到着時」「生成エリア中心部との距離」など色々と思いつくものがありますが*1、今回はキャラクターがギミックが見える位置に来たらのタイミングで作成します。

f:id:tsubaki_t1:20160111113034g:plain

実装のイメージ

実装のイメージはこんな感じです。
まずは事前準備から。

  • 「ステージ」と「ギミック」のシーンを分ける
  • CullingGroupから「ギミックの視界判定」を行うよう処理を作成

実行時の動作イメージ

  • 「ステージを読み込む」
  • CullingGroupで視界判定を行う
  • ギミックが視界内に入りそうならば、ギミックが含まれるシーンを読み込む

事前準備

まずステージとギミックのシーンに分割します。青い玉がギミックです。この辺りはUnity 5.3からマルチシーンエディティングが来たので、割と楽に出来ます。(Stage読んでる状態でGimmickシーンをHierarchyへドラッグ&ドロップする)

f:id:tsubaki_t1:20160111113914j:plain

CullingGroupで壁の判定も行いたいので、OcclusionCullingを設定します。OcclusionAreaを使用すると、計算が速く終わりますし精度調整が楽で良いです。

f:id:tsubaki_t1:20160111190347j:plain

視界判定に使用する座標ですが、Stage側に目印となる座標を配置して、それを参照します。可能であれば目印はGimmickシーンから値を持ってくると良い感じです。
今回はギミックと同じ位置に視界判定を置いていますが、実際それをやると大変なので、ギミック群の四隅に視界判定を配置するような形が良いと思います。

f:id:tsubaki_t1:20160111185436j:plain

gist.github.com

あとはGimmick側のシーンをアンロードすれば事前準備は完了です。(二重ロードを回避するため)

f:id:tsubaki_t1:20160111115607j:plain

 見える位置についたらシーンをロード

見える位置についたらシーンをロードする処理を追記します。

f:id:tsubaki_t1:20160111185934j:plain

gist.github.com

今回は行って居ませんが「見えなくなって、かつ距離が結構離れてきたらオブジェクトを破棄してリソースを解放する」みたいな処理があっても面白いかもしれません。

プレハブから生成するアプローチ

この手法、一応シーンビューではなくPrefabを生成するアプローチも考えられます。例えばCullingGroupの視界判定で、現在のGameObjectに指定のPrefabを生成する…といった感じです。
このアプローチはシーンビューのアプローチと比べて単純な柔軟性がありますが、ユニーク化したプレハブを扱う場合は面倒臭い所があったので、今回はシーンビューで行っています。

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

*1:殆どの場合、これで問題無いと思います