This document is about: FUSION 2
SWITCH TO

씬 로딩

개요

Fusion은 유니티의 씬 관리를 내장하지 않지만, INetworkSceneManager 인터페이스를 제공하여 Fusion이 씬 변경과 같은 다양한 씬 관련 이벤트에 응답하는 방법을 정의할 수 있습니다.
INetworkSceneManager의 구현체를 씬 관리자라고 합니다.

INetworkSceneManager의 구현체는 NetworkRunner.StartGame() 메서드의 StartGameArgs.SceneManager 필드를 통해 할당되어야 합니다. 구현체가 제공되지 않은 경우(null), Fusion은 NetworkSceneManagerDummy 클래스를 인스턴스화하며, 씬 객체를 연결할 수 없다는 오류를 로그로 출력합니다.

Fusion에는 NetworkSceneManagerDefault라는 기본 구현이 포함되어 있으며, 다음 기능을 지원합니다:

  • 씬 로드 및 언로드
  • 일반 씬 로드와 Addressables를 통한 씬 로드 지원
  • 현재 활성 씬의 재로드
  • 최대 8개의 씬을 동시 로드(추가적 로드 방식)
  • 여러 피어에서의 씬 로드를 지원하며, 각 Runner에 대해 올바른 PhysicsScene을 설정

씬 로드 및 언로드

중요: LoadScene()UnloadScene()은 서버/호스트 또는 마스터 클라이언트에서만 호출할 수 있습니다. (이는 기본 씬 관리자 구현에 의해 강제되며, 커스텀 구현도 이를 강제해야 합니다)

씬을 로드하려면, NetworkRunner.LoadScene()을 호출하고 씬의 SceneRefLoadSceneParameters를 전달합니다. 단일 로드 모드(Single Load Mode)로 로드하면 이전 씬이 모두 언로드되며, 추가적 로드 모드(Additive Scene Loading)로 로드하면 이전 씬은 유지됩니다.

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);

씬을 언로드 하려면 NetworkRunner.UnloadScene()을 호출하고 언로드할 씬의 SceneRef를 전달합니다.

C#

// Unloading scene 1.
if (Runner.IsSceneAuthority) {
  Runner.UnloadScene(SceneRef.FromIndex(1));
}

씬을 다시 로드하려면 씬을 언로드한 후 다시 로드하는 순서를 따릅니다. NetworkSceneManagerDefault 구현은 씬이 로드되거나 언로드될 때마다 증가하는 Version 필드를 유지합니다. 이 필드는 동일한 씬이라도 이전에 로드된 씬과 새로 로드된 씬을 구분하는 데 사용됩니다.

C#

// Reloading scene 2.
if (Runner.IsSceneAuthority) {
  Runner.UnloadScene(SceneRef.FromIndex(2));
  Runner.LoadScene(SceneRef.FromIndex(2), LoadSceneMode.Additive);
}

SceneRefSceneRef.FromIndex(int index)를 사용하여 인덱스로 생성하거나, Addressables 씬 참조를 생성할 때 주로 사용되는 경로로 생성할 수 있습니다(SceneRef.FromPath(string path)).

커스텀 네트워크 관리자 생성

NetworkSceneInfo

사용자가 제어하는 활성 씬 정보를 나타냅니다. 최대 8개의 활성 씬을 저장할 수 있으며, 중복이 허용됩니다. 커스텀 구현을 생성하기 위한 좋은 출발점입니다. 이 네트워크 구조체는 NetworkRunner가 씬 로드를 올바르게 동기화하기 위해 네트워크로 전송됩니다. 씬 권한(Host/Server 또는 마스터 클라이언트)이 씬 정보를 변경할 때마다, INetworkSceneManager 인스턴스의 OnSceneInfoChanged()가 호출됩니다.

INetworkSceneManager

씬 로드를 제어하는 방법을 완전히 제어하려면 StartGameArgs에서 이 인터페이스를 구현하십시오. 구현체는 Fusion 씬 로드 콜백 Runner.InvokeSceneLoadStart(sceneRef)Runner.InvokeSceneLoadDone(SceneLoadDoneArgs)를 호출해야 합니다. 기본 동작을 확인하려면 NetworkSceneManagerDefault 구현을 참조하십시오.

인터페이스는 다음 메서드와 속성을 제공합니다:

  • void Initialize(NetworkRunner runner) : Runner가 초기화될 때 호출됩니다. NetworkRunner 참조를 저장하고 필요한 초기 작업을 수행하십시오.

  • void Shutdown() : Runner가 종료될 때 호출됩니다. 참조를 해제하고 대기 중인 작업을 중단하십시오.

  • bool IsBusy : 씬 관리자가 씬을 로드하거나 다른 작업을 수행 중인 경우 이를 알립니다.

  • Scene MainRunnerScene : 특정 NetworkRunner의 주요 씬을 나타냅니다. 주로 다중 피어 지원에 사용됩니다.

  • bool TryGetPhysicsScene2D(out PhysicsScene2D scene2D) : 2D 물리 씬을 출력 매개변수에 설정하고 작업 결과를 반환합니다.

  • bool TryGetPhysicsScene3D(out PhysicsScene scene3D) : 3D 물리 씬을 출력 매개변수에 설정하고 작업 결과를 반환합니다.

  • void MakeDontDestroyOnLoad(GameObject obj) : 로드 중 파괴되지 않도록 객체를 설정합니다. (다중 피어 지원을 위해 사용)

  • void MoveToRunnerScene(GameObject obj) : 전달된 객체를 해당 NetworkRunner와 관련된 씬으로 이동합니다.

  • bool IsRunnerScene(Scene scene) : 주어진 씬이 NetworkRunner와 관련된 씬인지 반환합니다.

  • NetworkSceneAsyncOp LoadScene(SceneRef sceneRef, LoadSceneParameters parameters) : 전달된 매개변수로 새로운 씬을 로드합니다. 씬 로드 방식은 개발자에 의해 결정되며, 새로 로드된 NetworkObjectsNetworkRunner.RegisterSceneObjects(SceneRef scene, NetworkObject[] objects, byte loadId = 0)로 등록해야 합니다.

  • NetworkSceneAsyncOp UnloadScene(SceneRef sceneRef) : 씬을 언로드합니다.

  • void OnSceneInfoChanged() : NetworkRunnerINetworkSceneInfo가 변경될 때 호출됩니다. 이를 사용하여 클라이언트에서 씬 로드를 트리거 하십시오.

  • SceneRef GetSceneRef(string sceneName) : 주어진 씬 이름에 기반하여 SceneRef를 반환합니다.

Back to top