テラシュールブログ

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

シーンローダー試作してみた

Unity4でActiveが仕様変更され大分使いやすくなったので、シーンローダーを作ってみた。
初回起動はロードが必要だが、一度表示した画面は爆速で切り替わるのでかなり快適。

リソースキャッシュすればより高速化が可能だし、けっこういい線行ってると思う。

デモ
http://t.co/SFfJmr90

2012122501.png
一番下のボタンはLoadLevelで全部メモリを綺麗にしてる。

■シーンローダー

基本的な構造は「もののけ大戦“陣”製作事例」のシーンキャッシュ機能を参考にした。

もののけ大戦“陣”製作事例
http://www.slideshare.net/RyoheiTokimura/ss-14048278

つまり、シーンをLoadLevelAdditiveで配置してシーン切替はActiveを切り替えるだけって方法。これなら部分的にシーンをロード出来るので使わないシーンはロードせず読めるし、破棄時のオーバーヘッドも少ない。
少なくともResourcesでオブジェクト毎に組み立てる的な、超面倒くさい手順は踏まなくて済む。

2012122502.png


一応Application.LoadLevelとも共用出来るので、大きなシーン切り替えはそっちでやったほうが楽かも。
(例えばブリーフィング→ゲーム→デブリーフィング等)はLoadLevelでメモリ周りもスッキリしてもらって、UIの切り替えはSceneLoaderでやる感じ。)

それ以上複雑化するならリソースキャッシュにマテリアル突っ込んどいて高速化…ぐらいにしないと事故率が上がりそう。

[Unity3D]ロードの待ち時間を短くする(その4/Application.LoadLevelAdditive)
http://terasur.blog.fc2.com/blog-entry-222.html



■現状の機能

現状の機能は3つ。

・シーンをロード。初回はロードして二回目はactive切替。
 一応active切替時もAwakeとStartを呼ぶ。
 変更した値はそのまま。

・シーンのリロード。シーンのstatic変数以外のコンポーネントや座標を全部初期化する。
 単純なActive切り替えと比べて、ちと遅い。

・カレントシーン以外のシーンキャッシュを破棄してメモリを確保
 ライトマップは破棄出来ない(方法がわからない)

近いうちにAssetStoreかGithub辺りにでも出そうと思うけど、需要あるかな・・・