Version: 2019.1
UI プロファイラー
ランタイム時にリソースをロード

複数シーンの編集

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

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

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

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

エディターで

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

Open Scene Additive は、階層で表示されているシーンリストに選択したシーンアセットを追加します。
Open Scene Additive は、階層で表示されているシーンリストに選択したシーンアセットを追加します。

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

同時に開いている複数のシーンを表示する Hierarchy ウィンドウ
同時に開いている複数のシーンを表示する 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)
シーン分割バーのメニュー内で表示される GameObject サブメニュー
シーン分割バーのメニュー内で表示される GameObject サブメニュー

アンロードしたシーンのシーン分割メニュー

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.

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

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

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

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

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

一度に複数シーンの 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 シーンへのアクセス権がありません。また、ランタイムでは使用できません。

シーンの個別設定

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

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

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

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

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

スクリプティング

エディタースクリプティング

エディタースクリプティングに関して、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 を使用します。

既知の問題

  • エディットモードではシーン間の参照はサポートされておらず、防止されています。プレイモードではシーンの保存ができないため、シーン間の参照は可能です。

2017–10–24 限られた 編集レビュー で修正されたページ

UI プロファイラー
ランタイム時にリソースをロード