sound sepher's PASTIME

ゲーム開発で思ったことや、趣味などの話を書き綴っていきます。

【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 のチェックが入ってないと直接光が反映されないっぽい
    • Bakedモードでは、すべてBaked GI が担当するがベイクに時間がかかる
    • Realtimeモードでは、すべてリアルタイムで実行する代わりにCPUに負担がかかる
他のシーンの Directional Light などは反映される
  • どうシーンを切り分けるかは慎重に検討すべき

参考

マルチシーン

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

gamebiz.jp

シングルトン

unity.moon-bear.com

ScriptableObject

forpro.unity3d.jp

ekulabo.com

Light

machio-kinniku.hatenablog.com