GPU エリア
ランタイム時にリソースをロード

マルチシーン編集

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

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

本ページでは以下を説明しています。

  • エディターに統合されたマルチシーン編集について
  • エディターとランタイムで使用できる API について
  • 既知の問題点について

エディターでの操作

開いた新しいシーンをヒエラルキーのシーンリストに加えるために、シーンアセット上で右クリックして開いたコンテキストメニューで Open Scene Additive を選択するか、プロジェクトウィンドウからヒエラルキーウィンドウへと 1 つ以上のシーンをドラッグします。

Open Scene Additive は、ヒエラルキー上に表示されているシーンリストに選択したシーンアセットを追加します。
Open Scene Additive は、ヒエラルキー上に表示されているシーンリストに選択したシーンアセットを追加します。

エディターで複数のシーンを開いたとき、各シーンのゲームオブジェクトはヒエラルキーのウィンドウで別々に表示されます。各シーンのゲームオブジェクトは、シーン名とシーンの保存状態を示す分割バーの下に表示されます。

同時に開いている複数のシーンを表示するヒエラルキーのウィンドウ
同時に開いている複数のシーンを表示するヒエラルキーのウィンドウ

シーンがヒエラルキー内にある間、各シーンに含まれるゲームオブジェクトを 表示 / 非表示 にするために、シーンをロード/アンロードすることができます。これは、ヒエラルキーのウィンドウからシーンを追加/削除する処理とは異なります。

シーンの分割バーを使用すると、多くのシーンを読み込んだときに、ヒエラルキー内に表示されているゲームオブジェクト群をシーン単位で折りたたむことができるので、ヒエラルキーでの操作が楽になります。

複数シーンで作業しているときには、変更点は各シーンに対して保存しなければいけないため、変更点を保存していないシーンを同時に開くことが可能になっています。変更点を保存していないシーンは、分割バーのシーン名の横にアスタリスク(*)が表示されます。

このシーンには変更点がありますが、アスタリスク(*)が表示されているのでまだ保存されていません。
このシーンには変更点がありますが、アスタリスク(*)が表示されているのでまだ保存されていません。

各シーンは、分割バーの上で表示できるコンテキストメニューから別々に保存することができます。ファイルメニューから “Save Scene” を選択するか、Ctrl/Cmd + S を押して、開いている すべての シーンの変更点を保存します。

シーンの分割バーのコンテキストメニューでは、他にも選択したシーンに対してアクションをとることができます。

読み込んだシーンメニューの一覧

Set Active Scene これは、新規のゲームオブジェクトを 作成/インスタンス化 するシーンを指定することができます。常に 1 シーンがアクティブなシーンとしてマークされます。
Save Scene 選択しているシーンのみを保存します。
Save Scene As 新規のシーンアセットとして選択しているシーン(現在の変更とともに)を保存します。
Save All すべてのシーンの変更点を保存します。
Unload Scene シーンをアンロードしますが、ヒエラルキーウィンドウ内に表示されたままとなります。
Remove Scene ヒエラルキーウィンドウからシーンをアンロードと削除をします。
Select Scene Asset プロジェクトウィンドウ上にあるシーンアセットを選択状態にします。
GameObject 選択したシーンでゲームオブジェクトが作成可能なサブメニューを提供できます。メニューは Unity の GameObject メインメニューで使用できる作成可能なアイテムを反映しています。(下図を参照してください)
シーン分割バーのメニュー内で表示される GameObject サブメニュー
シーン分割バーのメニュー内で表示される GameObject サブメニュー

アンロードされているシーン分割バーのメニュー

Load Scene シーンを読み込みます。
Remove Scene ヒエラルキーウィンドウからシーンを削除します。
Select Scene Asset プロジェクトウィンドウ上にあるシーンアセットを選択状態にします。

複数のシーンでライトマップをベイクする

一度に複数のシーンの Lightmap データ をベイクするには、ベイクしたい複数のシーンを開き、Lighting Window で “Auto” モードをオフにして、Build ボタンでライトをベイクします。

入力されるライトの計算はすべてのシーンの静的なジオメトリとライトが含まれます。よって、影と GI ライトの跳ね返りはすべてのシーンで動作します。ですが、ライトマップとリアルタイム GI データはシーンごとにロード/アンロードしたデータが分割されて保存されます。ライトマップとリアルタイム GI データのアトラスはシーン間で分割されます。これは、シーン間でライトマップが決して共有されないし、シーンをアンロードする場合、安全にアンロードできることを意味します。ライトプローブのデータは常に共有され、まとめてベイクされた全シーンのすべてのライトプローブは、同時にロードされます。

代わりに、エディタースクリプトのLightmapping.BakeMultipleScenesを使用することで複数シーンのライトマップを自動的にビルドできます。

複数シーンで Navmesh データをベイクする

一度に複数シーンの Navmesh データ を作成するには、ベイクしたいシーンを開き、Navigation ウインドウで Bake ボタンをクリックします。ナビメッシュデータは、単一アセットにベイクされ、すべての読み込まれたシーンで共有されます。データは、現在アクティブなシーンの名前と一致するフォルダー(例:ActiveSceneName/NavMesh.asset)に保存されます。読み込まれたすべてのシーンは、このナビメッシュアセットを共有します。ナビメッシュをベイクした後、影響を受けたシーンは、シーンとナビメッシュの参照を永続的にするために、保存される必要があります。

代わりに、エディタースクリプトの NavMeshBuilder.BuildNavMeshForMultipleScenes機能を使用することでマルチシーンのナビメッシュデータを自動的にビルドできます。

再生モード

再生モードでは、ヒエラルキーの複数シーンの表示に加え、DontDestroyOnLoad (シーン切替時に破棄されない)が表示されるようになりました。

Unity 5.3以前は、“DontDestroyOnLoad” としてマークされたインスタンスは、再生モードでもヒエラルキーに表示される場合がありました。これらのオブジェクトは、シーンの一部には含まれませんが、オブジェクトを検査する必要性があるため、DontDestroyOnLoad シーンを作成してその中で管理するようにしました。

ユーザーは、DontDestroyOnLoad シーンへのアクセス権がありません。また、ランタイムでは使用できません。

シーンの個別設定

特定の設定は、各シーンに個別に保存されています。

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

特定のシーン設定を動作させるには、各シーンごとで独自の設定を管理し、そのシーンに関連する設定のみシーンファイルに保存する方法です。

複数のシーンを開いた場合、レンダリングとナビメッシュに使用される設定はアクティブなシーンのものです。つまり、シーン設定を変更したい場合、ひとつのシーンのみ開く、設定を変更する、問題になっているシーンをアクティブなシーンにさせる、あるいは設定を変更する、のいずれかになります。

エディターあるいはランタイムでアクティブなシーンを切り替えると、新しいシーンからすべての設定が適用され、以前設定したすべてが置き換えられます。

スクリプティング

エディタースクリプティング(Editor Scripting)

エディタースクリプティングに関して、Unity はScene structEditorSceneManagerAPI や SceneSetupを提供しています。

Scene structは、エディターとランタイムの両方で利用できます。シーン自体に関連するシーン名や、アセットパスなどのような、読み取り専用のプロパティーがあります。

EditorSceneManager クラスはエディターでのみ使用可能です。それは SceneManager から派生して、エディタースクリプティングによって、上記すべてのマルチシーン編集機能を実装できる多くの機能があります。

SceneSetup クラスは、ヒエラルキーで現在のシーンに関する情報を保存するための小さなユーティリティクラスです。

UndoPrefabUtilityクラスはマルチシーンに対応するため拡張しました。 [PrefabUtility.InstantiatePrefab]を使用して、指定されたシーンでプレハブをインスタンス化することができ、 (Undo.MoveGameObjectToScene)[ScriptRef:Undo.MoveGameObjectToScene]を使用して Undo する方法でシーンのルートにオブジェクトを動かすことができます。

注意: *Undo.MoveGameObjectToSceneを使用するために、現在入っているシーンのルートにゲームオブジェクトがすでに存在していることを確認する必要があります。

スクリプト(ランタイム)

ランタイム時のスクリプトについて、LoadSceneUnloadScene など複数のシーンで動作する機能は SceneManagerクラスにあります。

注意

ファイルメニューの Save Scene As は、アクティブなシーンを保存するだけです。Save Scene は、名称未設定のシーンがある場合、シーン名をつけるよう促すことを含め修正されたすべてのシーンを保存します。

プロジェクトウィンドウの Create メニューから新しいシーンアセットを作成する
プロジェクトウィンドウの Create メニューから新しいシーンアセットを作成する

ヒントや要領

ドラッグしながらAltキーを保持することで アンロード 状態を維持したままヒエラルキーにシーンを追加することが可能です。これにより、望むときに、後でシーンをロードするオプションを与えています

新しいシーンは、プロジェクトウィンドウで Create メニューを使用して作成することができます。新規シーンには Game Objects の設定がデフォルトで含まれています。

Unity を再起動させるたびにヒエラルキーを再設定することを回避するため、使うことができる異なる設定の保存を簡単にするため、あるいは現在の設定を記述する SceneSetup オブジェクトのリストを取得するためにEditorSceneManager.GetSceneManagerSetup を使用することができます。次に、シーン設定に関する情報を保存したい場合、これらを ScriptableObject に、またはシーン設定について保存したい他の情報と一緒に他の場所にシリアライズすることが可能です。ヒエラルキーを元に戻すためには、 SceneSetups のリストを再作成し、EditorSceneManager.RestoreSceneManagerSetupを使用します。

実行時にロードしたシーンのリストを取得するには、 sceneCount を取得し、GetSceneAtで繰り返してシーンを取得します。

GameObject.scene を通じてシーンに属する GameObject を取得したり、SceneManager.MoveGameObjectToScene を使用してシーンのルートにゲームオブジェクトを動かすことが可能です。

シーンの読み込みで、マネージャーオブジェクトの役割を持つゲームオブジェクトを残したいときに DontDestroyOnLoad を使用するのは避けてください。代わりに、マネージャーオブジェクトを持つシーンを作成し、ゲームの進行を管理するSceneManager.LoadScene(<path>,LoadSceneMode.Additive) と SceneManager.UnloadScene を使用します。

既知の問題

  • シーン間の参照はサポートしていませんが、防止はしていないので参照することは可能です。
  • まだ Umbra からのオクルージョンカリングのデータを、付加的に読み込むことができません。
GPU エリア
ランタイム時にリソースをロード