シーンローディング
概要
FusionにはUnityのシーンを処理する実装は含まれていませんが、INetworkSceneManagerインターフェースによって、様々なシーン関連のイベント(シーン遷移など)にどのように反応するかを定義できます。INetworkSceneManagerの実装は、NetworkRunnerに渡した後にSceneManagerとみなされます。
INetworkSceneManagerの実装は、NetworkRunner.StartGame()のStartGameArgs.SceneManagerで渡す必要があります。実装が渡されない(null)なら、FusionはNetworkSceneManagerDummyクラスのインスタンスを作成し、シーンオブジェクトを生成できない旨のエラーログを出力します。
Fusionにはデフォルト実装のNetworkSceneManagerDefaultが用意されていて、以下のことが可能です。
- シーンのロード・アンロード
 - Addressableなシーンのロードに対応
 - アクティブなシーンのリロード
 - 最大8つ同時でAdditiveなシーンのロード
 - マルチピアモードに対応(各
NetworkRunnerに対しての、正しいPhysicsSceneの関連付け) 
シーンのロード・アンロード
重要: LoadScene()とUnloadScene()は、マスタークライアントからのみ呼び出すことができます。これはNetworkSceneManagerDefaultによって強制されていて、独自実装でも同様に強制する必要があります。
シーンをロードするには、SceneRefとLoadSceneParametersを渡してNetworkRunner.LoadScene()を呼び出します。LoadSceneMode.Singleでは前のシーンは全てアンロードされますが、LoadSceneMode.Additiveでは前のシーンはロードされたままになります。
C#
// Loading 3 scenes in additive mode.
if (Runner.IsSceneAuthority) {
  Runner.LoadScene(SceneRef.FromIndex(1), LoadSceneMode.Additive);
  Runner.LoadScene(SceneRef.FromIndex(2), LoadSceneMode.Additive);
  Runner.LoadScene(SceneRef.FromIndex(3), LoadSceneMode.Additive);
}
SceneRefのインデックスは、Unityのシーンのビルドインデックスです。現在のシーンのインデックスを取得するには、SceneManager.GetActiveScene().buildIndexを使用します。他のシーンのインデックスは、SceneUtility.GetBuildIndexByScenePathで見つけることができます。例えば、Assets/Scenes/GameScene.unityに格納されているシーンのロードは、以下のようなコードになります。
C#
  Runner.LoadScene(SceneRef.FromIndex(SceneUtility.GetBuildIndexByScenePath("Assets/Scenes/GameScene.unity")), LoadSceneMode.Additive);
シーンをアンロードするには、アンロードするシーンのSceneRefを渡して、NetworkRunner.UnloadScene()を呼び出します。
C#
// Unloading scene 1.
if (Runner.IsSceneAuthority) {
  Runner.UnloadScene(SceneRef.FromIndex(1));
}
シーンのアンロードとロードを順番に行って、シーンを再ロードすることも可能です。NetworkSceneManagerDefaultのVersionフィールドはカウンタとして動作し、シーンをロード・アンロードするたびに増加します。この値は、シーンオブジェクトのIDの登録に使用され、たとえ同じシーンを再ロードしたとしても、前のシーンと新しいシーンは差別化されます。
C#
// Reloading scene 2.
if (Runner.IsSceneAuthority) {
  Runner.UnloadScene(SceneRef.FromIndex(2));
  Runner.LoadScene(SceneRef.FromIndex(2), LoadSceneMode.Additive);
}
SceneRefは、シーンのインデックスからSceneRef.FromIndex(int index)で作成するか、主にAddressableなシーンのパスからSceneRef.FromPath(string path)で作成します。