テラシュールブログ

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

Active切替タイプのシーンローダー その2

試作中のシーンローダーの続き。

[Unity3D]シーンローダー試作してみた
http://tsubakit1.hateblo.jp/entry/20121225/1356446625

機能的に大分拡張したので、そろそろ出そうか考え中。
出す方針は、とりあえずDLL化して公開、
様子を見てソースコードは欲しい人に…という感じになるかも。

デモ
https://dl.dropbox.com/u/56297224/UnitySumple2/SceneManager/SceneLoader/web%20player.html

スクリーンショット 2013-02-03 23.09.24
表示は左から、「シーン名」「ロード済みか」「Activeか」。
ボタンは「通常の読み込み」「ソフトリセット」「ハードリセット」「LoadLevelで読む」「追加よみ」「追加よみ(既に読込済みの場合はハードリセット)」「シーンを非アクティブ」
下之ボタンは「カレントのシーン以外は非アクティブ」


■機能一覧

現状の機能はこんな感じ

・シーンを初回はロードして、次回以降はActive切り替える感じでロード
 (呼び出したシーン以外は非アクティブにする)

・特定のシーンを現在のシーンに加算読込
 (既に呼び出し後の場合はアクティブにする)

・特定のシーンをソフトリセット
 (StartとInitを呼ぶ。AwakeはNGUIが悪さするので呼べない)

・特定のシーンをハードリセット
 (Static以外の値や座標を強制リセット。ソフトより安定するが少し遅い)

・LoadLevelを呼び出してシーンを綺麗にしてもらう
 (これで管理するのが一番楽)

・特定のシーンを破棄してメモリを確保

・Activeでないキャッシュ済シーンを全て破棄してメモリを確保

・メモリ不足した時に通知(ios/Androidのみ)
 (この時、アクティブでないキャッシュ済シーンを全て破棄してメモリを確保)

・ゲームをポーズした時にアクティブでないキャッシュ済シーンを破棄してメモリを確保
 (バックグラウンドに回った時に落とされる対策)

・StreamingAssetsから画像を非同期で読み込みマテリアルを更新する機能
 (主にNGUIのAtlas更新用)

・↑の機能で、エディタ上でランタイムに差し替え結果を確認(ビルドには含めない)

・↑↑機能で、使う画像の暗号化・復号化(適当な暗号)

複数のオブジェクトをマージして一つのオブジェクトに入れる機能
 (音が非アクティブになった時に止まる対策)

スクリーンショット 2013-02-03 22.00.26
エディタ上でランタイムに差し替え結果を確認。ビルド時は別の適当な画像が割り当てられる。単純なランタイムロードではエディタで作りながら確認するのが面倒なため追加。


■使い方

この機能を使う条件は、下の3つ。

1.シーンの全オブジェクトを、シーンと同名のGameObject下に置くこと
2.シーンと同名オブジェクトにSceneRootを付ける
3.シーンのRoot直下にSceneLoerインスタンスがあること

スクリーンショット 2013-02-03 22.33.24
これでシーンローダーの機能は使えるようになる。

一応NGUIチュートリアルの幾つかを試したが、問題なく動作した。


使用の想定としては、
シーンを最低限ロード → 必要なシーンを追加で動的にロード 
→ ゲームが完全に変わるタイミングでLoadLevelで綺麗にしつつ最低限ロード
  (例えば、インターミッション⇔アクションゲーム)
→ 必要なシーンを追加で動的にロード

と言った感じ。

あんまりメモリ管理に手間をかけるとUnityの楽しさが減るので、出来る限り簡単に管理出来る方法を模索してる。やっぱりLoadLevelでメモリ消費を減らしたほうが管理が楽なので、それを出来るようにした。



とりあえず俺俺フレームワークにかかってる気がするので、なんとかしないとな・・・