テラシュールブログ

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

ロードの待ち時間を短くする(その4/Application.LoadLevelAdditive)

■Application.LoadLevelAdditiveで読み込む

もう一つはApplication.LoadLevelAdditiveで読み込む方法。
これは、現在のシーンに特定のシーンの中身を追加する機能で、
サブメニューの読み込みや、ステージを分割したい時等に便利。

ちなみにPro版では非同期読み込みも対応しているみたい。
上手く使えばシームレスなゲーム読み込みが出来るようになるかも。

スクリーンショット 2012-08-01 7.25.45


デモ(※Basic)
http://bit.ly/OvYBNK

■読み込みのオーバーヘッドを忘れるな

注意点は3点。
・Application.LoadLevelAdditiveはオーバーヘッドがある
・ロード後展開する位置は、シーンの全体座標に依存
・シーン移動する訳ではないので、シーン名は変わらない

Application.LoadLevelAdditiveはリソース読み込みとは別に、
オーバーヘッドがあるみたい。
この問題のせいで、細かくモデルをロードするのには向かないような気がする。
(テクスチャ1枚とか、モデル1個とか)

とは言え非同期ロードが使えるなら、数種類を一括ロードしてやるとか、
そんな使い方ができればアリかも。

あと、2つ目の理由で、シーンを作るときはちょっとした工夫が必要になる。

■ヒャッハー!シーンを分割だー

Application.LoadLevelAdditiveで読み込む場合、座標は全体座標に依存する。
なので、全体を含めるシーン(雑でも可)を作って、共通する部分をそぎ落とす感じになる。

手順的にはこんな感じ。
1.全体を含めるシーンを作る
  (接続部分がしっかりしていれば、少々雑でも可)
2.別名保存でシーンを複数コピーする
3.各々のシーンで、自分が担当するシーン以外の部分を削除する

スクリーンショット 2012-07-31 3.10.31

重複部分はプレハブ化しておくと、結合前でも動作を確認できる。
カメラとか、動かせるキャラクターとか。

また、分割した時に全体を空のGameObject(出来ればシーン名と同じ名前)に
しておくと、一括削除が楽にできる。
なので、不要になった部分は削除してResources.UnloadUnusedAssets()してやると良さ気。


あと、UIなどを分割する場合は(0,0,0)な座標に作っていると、
干渉してしまうことがある。
その場合は、UI以外のカメラをOFFにする処理を作っておくのと、
UIの座標を全然違う座標にしておくと、うまい感じになるみたい。

LoadLevelHoge Unity(万年素人からGeekへの道)
http://d.hatena.ne.jp/shinriyo/20120128