はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】マルチシーンエディティングを初めて触ってみる

はじめに

今回はマルチシーンエディティングを使ってみようという記事になります!

複数シーン編集によって、複数のシーンを同時にエディター上で開くことが可能になり、実行時でも簡単に複数シーンを管理できるようになりました。

エディターで複数のシーンを同時に開けることは、大規模な世界を構築するのを可能にし、ワークフローの改善にも繋がります。

複数シーンの編集 - Unity マニュアル

UIとステージを別々のシーンで作成したり、ステージを分割して必要なシーンだけロードするといった使い方をすることができます。

以前から知ってはいたのですが、実際に手を出したことがなかったのでこれを機に触ってみたいと思います。

マルチシーンエディティングの概要

マルチシーンエディティングでは以下のように複数のシーンを同時に管理することができます。

f:id:hanaaaaaachiru:20200510201819p:plain

複数シーンが存在する時、ActiveSceneというものが存在します。

  • ActiveSceneにのみゲームオブジェクトを作成(インスタンス化)することができる
  • 必ず一つ存在する

ただしActiveなシーンからゲームオブジェクトを移動すること(D&D)はできるし、スクリプトからもゲームオブジェクトを移動させる(ルートオブジェクトのみ)こともできます。
Unity - Scripting API: SceneManagement.SceneManager.MoveGameObjectToScene

実際にやってみる

マルチシーンエディティングのやり方は簡単で、あるシーンが開いている状態でProjectViewからHierarchyにドラッグ&ドロップすればOKです。

f:id:hanaaaaaachiru:20200510201648p:plain

スクリプトから他のシーンを追加したい場合はSceneManager.LoadSceneメソッドの引数にLoadSceneMode.Additiveを指定します。(非同期ならLoadSceneAsync)

SceneManager.LoadScene("SceneB", LoadSceneMode.Additive);
SceneManager.LoadSceneAsync("SceneC", LoadSceneMode.Additive);


削除したいときはSceneManager.UnloadSceneメソッド(非同期ならUnloadSceneAsync)を使います。

SceneManager.UnloadScene( "ScenB" )
SceneManager.UnloadSceneAsync( "ScenC" )

これら方法からシーンを追加した場合は、ActiveSceneは入れ替わらないことに注意してください。

ActiveSceneを切り替える

エディタでActiveSceneを切り替えるには、Herarchy上にてActiveSceneにしたシーンを右クリックしSet Active Sceneを選択することでできます。

f:id:hanaaaaaachiru:20200510202706p:plain

スクリプトで変更したいときはSceneManager.SetActiveSceneメソッドを使います。
SceneManagement.SceneManager-SetActiveScene - Unity スクリプトリファレンス

SceneManager.SetActiveScene(SceneManager.GetSceneByName("SceneB");

読み込んだ後にActiveSceneに切り替えたいならこんな感じ。

var asyncLoad = SceneManager.LoadSceneAsync("SceneB", LoadSceneMode.Additive);
asyncLoad.completed += x => SceneManager.SetActiveScene(SceneManager.GetSceneByName("SceneB"));

シーンに紐づく設定

公式ドキュメントではこのように書かれています。

複数のシーンを開いた場合、レンダリングとナビメッシュに使用される設定はアクティブなシーンのものです。

複数シーンの編集 - Unity マニュアル

このレンダリングという言葉がどこまでの範囲を指すのか分かりませんが、直前に紹介されていたこれらはおそらくアクティブなシーンものを用いると思います。

  • RenderSettings と LightmapSettings(両方ともライティングウインドウにあります)
  • NavMesh 設定
  • Occlusion Culling Window にあるシーン設定

シーン間での参照

シーン間での参照にはシングルトンを用います。

www.hanachiru-blog.com

UIのカメラの設定

これらの記事に分かりやすく紹介をされていました。

どのようなシーン毎に分割するのかは自由ですが、特にCanvasScreen Space – Cameraはハマりポイントだと思うので参照してみると良いと思います。

qiita.com

engineering.enish.jp

さいごに

一通りマルチシーンエディティングで必要そうな箇所を挙げてみました。

シノアリスというゲームでのマルチシーンエディティングの実用例が以下の記事で紹介されていました。
gamebiz.jp

例えばクエストシーンでは以下の3つにシーンを分割しているようです。

  • フィールドシーン
  • UIシーン
  • ロジックシーン

このように設計することでより疎結合な設計にすることができ、開発スピードも上がるとのことです。

これくらい上手に活用できるように目指してこれからもちょくちょく使いながら勉強していきたいと思います。

ではまた。