Active切替タイプのシーンローダー その2
試作中のシーンローダーの続き。
[Unity3D]シーンローダー試作してみた
http://tsubakit1.hateblo.jp/entry/20121225/1356446625
機能的に大分拡張したので、そろそろ出そうか考え中。
出す方針は、とりあえずDLL化して公開、
様子を見てソースコードは欲しい人に…という感じになるかも。
デモ
https://dl.dropbox.com/u/56297224/UnitySumple2/SceneManager/SceneLoader/web%20player.html
表示は左から、「シーン名」「ロード済みか」「Activeか」。
ボタンは「通常の読み込み」「ソフトリセット」「ハードリセット」「LoadLevelで読む」「追加よみ」「追加よみ(既に読込済みの場合はハードリセット)」「シーンを非アクティブ」
下之ボタンは「カレントのシーン以外は非アクティブ」
■機能一覧
現状の機能はこんな感じ
・シーンを初回はロードして、次回以降はActive切り替える感じでロード
(呼び出したシーン以外は非アクティブにする)・特定のシーンを現在のシーンに加算読込
(既に呼び出し後の場合はアクティブにする)・特定のシーンをソフトリセット
(StartとInitを呼ぶ。AwakeはNGUIが悪さするので呼べない)・特定のシーンをハードリセット
(Static以外の値や座標を強制リセット。ソフトより安定するが少し遅い)・LoadLevelを呼び出してシーンを綺麗にしてもらう
(これで管理するのが一番楽)・特定のシーンを破棄してメモリを確保
・Activeでないキャッシュ済シーンを全て破棄してメモリを確保
・メモリ不足した時に通知(ios/Androidのみ)
(この時、アクティブでないキャッシュ済シーンを全て破棄してメモリを確保)・ゲームをポーズした時にアクティブでないキャッシュ済シーンを破棄してメモリを確保
(バックグラウンドに回った時に落とされる対策)・StreamingAssetsから画像を非同期で読み込みマテリアルを更新する機能
(主にNGUIのAtlas更新用)・↑の機能で、エディタ上でランタイムに差し替え結果を確認(ビルドには含めない)
・↑↑機能で、使う画像の暗号化・復号化(適当な暗号)
・複数のオブジェクトをマージして一つのオブジェクトに入れる機能
(音が非アクティブになった時に止まる対策)
エディタ上でランタイムに差し替え結果を確認。ビルド時は別の適当な画像が割り当てられる。単純なランタイムロードではエディタで作りながら確認するのが面倒なため追加。
■使い方
この機能を使う条件は、下の3つ。
1.シーンの全オブジェクトを、シーンと同名のGameObject下に置くこと
2.シーンと同名オブジェクトにSceneRootを付ける
3.シーンのRoot直下にSceneLoerインスタンスがあること
これでシーンローダーの機能は使えるようになる。
一応NGUIチュートリアルの幾つかを試したが、問題なく動作した。
使用の想定としては、
シーンを最低限ロード → 必要なシーンを追加で動的にロード
→ ゲームが完全に変わるタイミングでLoadLevelで綺麗にしつつ最低限ロード
(例えば、インターミッション⇔アクションゲーム)
→ 必要なシーンを追加で動的にロード
と言った感じ。
あんまりメモリ管理に手間をかけるとUnityの楽しさが減るので、出来る限り簡単に管理出来る方法を模索してる。やっぱりLoadLevelでメモリ消費を減らしたほうが管理が楽なので、それを出来るようにした。
とりあえず俺俺フレームワーク病にかかってる気がするので、なんとかしないとな・・・