ゴイサギ日記

東京でエンジニアとして頑張って何とか生きてます。。ゆる~く更新していきます

【Unity】Scene管理

自分なりのUnityのScene管理をまとめてみた。


あと本記事のSceneは.unityファイルを指します。

基本方針

想定環境

個人開発などの小規模プロジェクトでカジュアルゲーム想定、複雑な遷移は無し

Scene単位は大きく取る

自分の経験上、細かくすると仕様変更に耐えられないためです。

Multi Sceneで構成

ゲーム部分とシステム部分を分けたいので Multi Sceneで構成します。

Scene単位の機能

各Sceneの役割です。
(タイトル画面 > インゲーム画面へ遷移するゲームを例とする)

名前 役割
System シーン切り替え・入力・サウンド等ゲーム全体で使う常駐システム
Debug パラメータ調整・デバッグ機能ON/OFF・任意シーンへ直遷移等デバッグ関連
Title タイトル画面
InGame インゲーム画面

Debug版とRelease版の構成

開発(Debug版)と製品(Release版)で初回起動時の遷移を変えてます。

Debug版

System起動後、Debug画面へ


Debug画面です。ここから任意のSceneへ遷移します。

Release版

System起動後、Title画面へ

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を作業者単位で分けるといった工夫が ゲーム仕様によって必要になります。

参考

Unity - Scripting API: SceneManager