【Unity】マルチシーンメモ
マルチシーン
マルチシーンは、シーンをいくつも重ねて表示できる機能。
シーン追加命令
Addressables 経由
- Addressables.LoadSceneAsync(scene, LoadSceneMode.Additive)
- Completed などのコールバックが使える
- PercentComplete で状態確認できる(ゲージに反映可)
- アンロードは Addressables.UnloadScene(scene)
- Addressables を使うと、シーンをアセットバンドルに組み込める
- シーンは普通にビルドすると level0、level0.resS のようなファイルに変換される
- LZ4圧縮指定でビルドすると、resources.assets に丸ごと組み込まれる
- それを Addressables で StreamingAssets に切り離せるのは大きな意味がある
SceneManager 経由
- SceneManager.LoadScene(scene, LoadSceneMode.Additive)
- SceneManager.LoadSceneAsync(scene, LoadSceneMode.Additive)
- アンロードは SceneManager.UnloadScene(scene)
ポイント
全シーンに配置したオブジェクトやコードが自律動作可
- ひとつのシーンで実行してるように振舞ってくれる
- ただしクロスシーンリファレンス問題あり(後述)
- ライティングに注意(後述)
クロスシーンリファレンス
エディタ上の挙動 ×
- 別シーンのオブジェクトを別シーンにアタッチしても無意味
- アタッチ自体はできるがランタイム実行時に消えてしまう
ランタイムでの挙動 〇
- GameObject.Find 経由でシーンの関係なく取得できる
なお、Find を Update で使うのは重いので避ける事、タグで探すのがベター
- FindWithTag("文字列") でタグベースで取得
- FindGameObjectsWithTag("文字列") で複数のオブジェクトを配列で取得
シングルトン や ScriptableObject で解決
シングルトンの問題
- シングルトンを使う事でコード間の結びつきが強くなりすぎる問題
- 誰でもアクセスできる、これがないと動作しなくなるなど
- 全シーンでランタイム実行時に存在しない際、自動生成する仕組みが必須
ScriptableObject
- プロジェクト中にひとつしか存在しない
- どこから参照しても同じデータを取得できる
- シングルトンの代わりに使う
- 個人制作レベルでは正直どちらでもよい気はする
ライティングに注意
アクティブなシーンの設定が使用される要素
- Skybox
- Environment Lighting(環境光)
- Environment Reflections(環境反射)
- Realtime GI / Baked GI
- ミックスモードでは、直接光を Realtime GI、間接光を Baked GI が担当
- ミックスモードでベイク時、Realtime GI をオフにすると直接光の影響が消える
- 例えば Emission の光が床や壁に反映されなくなる
- 最初にアクティブにしたシーンで Realtime GI のチェックが入ってないと直接光が反映されないっぽい
- ミックスモードでベイク時、Realtime GI をオフにすると直接光の影響が消える
- Bakedモードでは、すべてBaked GI が担当するがベイクに時間がかかる
- Realtimeモードでは、すべてリアルタイムで実行する代わりにCPUに負担がかかる
- ミックスモードでは、直接光を Realtime GI、間接光を Baked GI が担当
他のシーンの Directional Light などは反映される
- どうシーンを切り分けるかは慎重に検討すべき