【Unity】シーンの「追加読込」と、追加読込したシーンの「破棄」
Unity 5.2よりLoadLevelAdtiveでロードしたシーンのアンロード(破棄)が可能になりました。
今までは「LoadLevelAditiveやResourcesからオブジェクトを取得」し、「SceneManagerに親オブジェクトを登録」「不 要になったら親オブジェクトごと消す」のような操作が必要でしたが、これが無くなり割と楽に追加・削除が可能になりました。
使い方(Unity 5.2)
呼び出し元となるScene1、ボタンを押すと飛び出すUIが記述されているScene2を用意します。追加でロードされるシーン2にはCameraやEventSystemは不要です。
後はシーンのロード・アンロードです。
シーンのロードは今まで通りApplication.LoadLevelAdditive ("シーン名");
で行います。逆にアンロードしたい場合はApplication.UnloadLevel ("シーン名");
を使用します。
なおリソースのアンロードは行ってくれないので、Resources.UnloadUnusedAssets
で解放してやる必要があります。
また「破棄できるシーンは一つのみ」なので、LoadLevelAditiveを連打した後にUnloadをかけても、全てのシーンが破棄されません。
今回のScene2のロード・アンロードの場合、以下のようなコードで行います。
private bool isLoaded = false; public void OnClick() { isLoaded = !isLoaded; if (isLoaded) { Application.LoadLevelAdditive ("Scene2"); } else { Application.UnloadLevel ("Scene2"); Resources.UnloadUnusedAssets(); } }
Resourcesとの比較
このアプローチの比較として上がるのは、「ResourcesにUI丸ごとプレハブとして配置し、実行時にインスタンス化する」方法だと思います。
この方法と比較すると、Sceneのアンロードは「プレハブとして使える範囲」において少し有利です。
というのも、プレハブは現在「ネスト化が出来ない」仕様があります。何が問題かと言えば、例えば「UIを丸ごとプレハブに」した場合、子プレハブも親プレハブの一部としてリンクが切れてしまうため、UIに使用しているボタンやテキストはプレハブとして登録出来なくなります。UI要素を後で一覧変更したいケースや、多人数でプロジェクト開発を進めた場合コンフリクトが起こりやすく、また起こした時にマージが若干面倒くさい事になる問題が上がります。
UnityYamlMergeがあるので多少は楽ですが…
あとはstatic batchingが効くオブジェクト・Navmesh等が含まれるステージ加算、ライトマップ等が可能な点が差別化になってるかなと思います。
逆にリソースが即読み終わる点がResourcesが優れてます。シーンの読み込みは早くてもフレームの終わりに完了だったと思いますし。
マルチシーンエディティング
これが本当に実用的になるのはUnity 5.3(現在ベータ中)からかなと思います。
Unity 5.3にはマルチシーンエディティングの機能が追加されており、こういった形でLoadLevelAditiveを行うと、下の画像のように各シーン毎にオブジェクトを並べてくれます。
また編集も複数のシーンをまたいで行う・複数のシーンをロードした状態でゲームを再生する等も可能になるので、かなりシーンの加算減算がやりやすくなるかなって気がします。