自分なりのUnityのScene管理をまとめてみた。
基本方針
想定環境
個人開発などの小規模プロジェクトでカジュアルゲーム想定、複雑な遷移は無し
Scene単位は大きく取る
自分の経験上、細かくすると仕様変更に耐えられないためです。
Multi Sceneで構成
ゲーム部分とシステム部分を分けたいので Multi Sceneで構成します。
Scene単位の機能
各Sceneの役割です。
(タイトル画面 > インゲーム画面へ遷移するゲームを例とする)
名前 | 役割 |
---|---|
System | シーン切り替え・入力・サウンド等ゲーム全体で使う常駐システム |
Debug | パラメータ調整・デバッグ機能ON/OFF・任意シーンへ直遷移等デバッグ関連 |
Title | タイトル画面 |
InGame | インゲーム画面 |
Debug版とRelease版の構成
開発(Debug版)と製品(Release版)で初回起動時の遷移を変えてます。
Multi Scene管理の注意点
ActiveSceneの変更を忘れずに
LoadSceneMode.Additive を使う場合は
SceneManager.SetActiveScene で
アクティブScene を適切に切り替えます。
そうしないとGameObject生成時に親オブジェクト未指定ではデフォルトの配置がアクティブScene直下になるため前回Sceneに配置される問題が発生します。
Hierarchyビューで太字表示のものがアクティブScene
Release版から Debug Scene を除外
Release版でデバッグ機能が誤作動すると困るので
関連するSceneや処理は全て消します。
私はビルド時に以下のように除外してます。
BuildPlayerOptions options = new BuildPlayerOptions(); options.scenes = new string[] { "System", "Title", "InGame" }; // Debugを除外. BuildReport report = BuildPipeline.BuildPlayer( options );
不要なSceneの削除
LoadSceneMode.AdditiveはSceneを破棄しないので注意が必要です。
SceneManager.UnloadSceneAsync を使い不要Sceneを削除します。
まとめ
今回はカジュアルゲーム向けでしたが
複雑なゲームではSceneを細かくを分けたり
Sceneを作業者単位で分けるといった工夫が ゲーム仕様によって必要になります。