複数シーン編集によって、複数のシーンを同時にエディター上で開くことが可能になり、実行時でも簡単に複数シーンを管理できるようになりました。
エディターで複数のシーンを同時に開けることは、大規模な世界を構築するのを可能にし、ワークフローの改善にも繋がります。
本ページでは以下を説明しています。
開いた新しいシーンを Hierarchy のシーンリストに加えるために、シーンアセット上で右クリックして開いたコンテキストメニューで Open Scene Additive を選択するか、プロジェクトウィンドウから Hierarchy ウィンドウへと 1 つ以上のシーンをドラッグします。
エディターで複数のシーンを開いたとき、各シーンのゲームオブジェクトは Hierarchy ウィンドウで別々に表示されます。各シーンのゲームオブジェクトは、シーン名とシーンの保存状態を示す分割バーの下に表示されます。
シーンが階層内にある間、各シーンに含まれるゲームオブジェクトを表示/非表示にするために、シーンを ロード/アンロード することができます。これは、Hierarchy ウィンドウからシーンを追加/削除する処理とは異なります。
シーンの分割バーを使用すると、多くのシーンをロードするときに、階層内に表示されているゲームオブジェクト群をシーン単位で折りたたむことができるので、階層での操作が楽になります。
複数シーンで作業しているときには、変更点は各シーンに対して保存しなければいけないため、変更点を保存していないシーンを同時に開くことが可能になっています。変更点を保存していないシーンは、分割バーのシーン名の横にアスタリスク(*)が表示されます。
各シーンは、分割バーの上で表示できるコンテキストメニューから別々に保存することができます。ファイルメニューから “Save Scene” を選択するか、Ctrl/Cmd + S を押して、開いている すべての シーンの変更点を保存します。
シーンの分割バーのコンテキストメニューでは、他にも選択したシーンに対してアクションをとることができます。
Set Active Scene | This allows you to specify which scene new Game Objects are created/instantiated in. There must always be one scene marked as the active scene |
Save Scene | Saves the changes to the selected scene only. |
Save Scene As | Saves the selected scene (along with any current modifications) as a new Scene asset. |
Save All | Saves changes to all scenes. |
Unload Scene | Unloads the scene, but keeps the scene in the Hierarchy window. |
Remove Scene | Unloads and removes the scene from the Hierarchy window. |
Select Scene Asset | Selects the scene’s asset in the Project window. |
GameObject | Provides a sub-menu allowing you to create GameObjects in the selected scene. The menu mirrors the creatable items available in Unity’s main GameObject menu. (shown below) |
Load Scene | Loads the scene’s contents |
Remove Scene | Remove the scene from the Hierarchy window. |
Select Scene Asset | Selects the scene’s asset in the Project window. |
一度に複数のシーンの ライトマップデータ をベイクするには、ベイクしたい複数のシーンを開き、Lighting ウィンドウで “Auto” モードをオフにして、Build ボタンでライトをベイクします。
入力されるライトの計算はすべてのシーンの静的なジオメトリとライトが含まれます。よって、影と GI ライトの跳ね返りはすべてのシーンで動作します。ですが、ライトマップとリアルタイム GI データはシーンごとにロード/アンロードしたデータが分割されて保存されます。ライトマップとリアルタイム GI データのアトラスはシーン間で分割されます。これは、シーン間でライトマップが決して共有されないし、シーンをアンロードする場合、安全にアンロードできることを意味します。ライトプローブのデータは常に共有され、まとめてベイクされた全シーンのすべてのライトプローブは、同時にロードされます。
代わりに、エディタースクリプトの Lightmapping.BakeMultipleScenes を使用することで複数シーンのライトマップを自動的にビルドできます。
一度に複数シーンの Navmesh データ を作成するには、ベイクしたいシーンを開き、Navigation ウインドウで Bake ボタンをクリックします。ナビメッシュデータは、単一アセットにベイクされ、すべての読み込まれたシーンで共有されます。データは、現在アクティブなシーンの名前と一致するフォルダー(例:ActiveSceneName/NavMesh.asset)に保存されます。読み込まれたすべてのシーンは、このナビメッシュアセットを共有します。ナビメッシュをベイクした後、影響を受けたシーンは、シーンとナビメッシュの参照を永続的にするために、保存される必要があります。
代わりに、エディタースクリプトの NavMeshBuilder.BuildNavMeshForMultipleScenes 機能を使用することでマルチシーンのナビメッシュデータを自動的にビルドできます。
複数のシーンの オクルージョンカリングのデータ を一度にベイクするには、ベイクしたいシーンを開き、Occlusion Culling ウィンドウ (Window > Rendering > Occlusion Culling) を開き、Bake ボタンをクリックします。オクルージョンデータは、現在のアクティブシーンの名前と一致するフォルダーの OcclusionCullingData.asset という名前のアセットに保存されます。例えば、Assets/ActiveSceneName/OcclusionCullingData.asset です。それぞれの開いたシーンにデータへの参照が加えられます。オクルージョンカリングをベイクした後、影響を受けるシーンを保存して、シーンからオクルージョンへの参照を永続化します。
シーンが追加で読み込みされる場合はいつも、そのシーンがアクティブなシーンとして同じオクルージョンデータの参照を持つ場合、シーンの静的レンダラーとポータルのカリング情報はオクルージョンデータによって初期化されます。これ以降、オクルージョンカリングシステムはまるで、静的レンダラーのように働き、ポータルは 1 つのシーンにベイクされます。
再生モードで、Hierarchy ウィンドウに複数シーンがある場合、追加シーンは DontDestroyOnLoad と表示されます。
Unity 5.3以前は、“DontDestroyOnLoad” としてマークされたインスタンスは、再生モードでも階層に表示される場合がありました。これらのオブジェクトは、シーンの一部には含まれませんが、オブジェクトを検査する必要性があるため、DontDestroyOnLoad シーンを作成してその中で管理するようにしました。
ユーザーは、DontDestroyOnLoad シーンへのアクセス権がありません。また、ランタイムでは使用できません。
特定の設定は、各シーンに個別に保存されています。
特定のシーン設定を動作させるには、各シーンごとで独自の設定を管理し、そのシーンに関連する設定のみシーンファイルに保存する方法です。
複数のシーンを開いた場合、レンダリングとナビメッシュに使用される設定はアクティブなシーンのものです。つまり、シーン設定を変更したい場合、ひとつのシーンのみ開く、設定を変更する、問題になっているシーンをアクティブなシーンにさせる、あるいは設定を変更する、のいずれかになります。
エディターあるいはランタイムでアクティブなシーンを切り替えると、新しいシーンからすべての設定が適用され、以前設定したすべてが置き換えられます。
エディタースクリプティングに関して、Unity はScene struct、EditorSceneManagerAPI や SceneSetupを提供しています。
Scene structは、エディターとランタイムの両方で利用できます。シーン自体に関連するシーン名や、アセットパスなどのような、読み取り専用のプロパティがあります。
EditorSceneManager クラスはエディターでのみ使用可能です。それは SceneManager から派生して、エディタースクリプティングによって、上記すべてのマルチシーン編集機能を実装できる多くの機能があります。
SceneSetup クラスは、階層で現在のシーンに関する情報を保存するための小さなユーティリティクラスです。
Undo と PrefabUtilityクラスはマルチシーンに対応するため拡張しました。 [PrefabUtility.InstantiatePrefab]を使用して、指定されたシーンでプレハブをインスタンス化することができ、 (Undo.MoveGameObjectToScene)[ScriptRef:Undo.MoveGameObjectToScene]を使用して Undo する方法でシーンのルートにオブジェクトを動かすことができます。
注意: *Undo.MoveGameObjectToScene
を使用するために、現在入っているシーンのルートにゲームオブジェクトがすでに存在していることを確認する必要があります。
ランタイムのスクリプティングについて、LoadScene や UnloadScene など複数のシーンで動作する機能は SceneManagerクラスにあります。
ファイルメニューの Save Scene As は、アクティブなシーンを保存するだけです。Save Scene は、名称未設定のシーンがある場合、シーン名をつけるよう促すことを含め修正されたすべてのシーンを保存します。
ドラッグしながら Alt キーを保持することで アンロード 状態を維持したまま階層にシーンを追加することが可能です。これにより、望むときに、後でシーンをロードするオプションを与えています
新しいシーンは、Project ウィンドウで 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 を使用します。
2017–10–24 修正されたページ