씬 로딩
개요
Fusion은 유니티의 씬 관리를 내장하지 않지만, INetworkSceneManager
인터페이스를 제공하여 Fusion이 씬 변경과 같은 다양한 씬 관련 이벤트에 응답하는 방법을 정의할 수 있습니다.
INetworkSceneManager
의 구현체를 씬 관리자라고 합니다.
INetworkSceneManager
의 구현체는 NetworkRunner.StartGame()
메서드의 StartGameArgs.SceneManager
필드를 통해 할당되어야 합니다. 구현체가 제공되지 않은 경우(null), Fusion은 NetworkSceneManagerDummy
클래스를 인스턴스화하며, 씬 객체를 연결할 수 없다는 오류를 로그로 출력합니다.
Fusion에는 NetworkSceneManagerDefault
라는 기본 구현이 포함되어 있으며, 다음 기능을 지원합니다:
- 씬 로드 및 언로드
- 일반 씬 로드와 Addressables를 통한 씬 로드 지원
- 현재 활성 씬의 재로드
- 최대 8개의 씬을 동시 로드(추가적 로드 방식)
- 여러 피어에서의 씬 로드를 지원하며, 각 Runner에 대해 올바른 PhysicsScene을 설정
씬 로드 및 언로드
중요: LoadScene()
및 UnloadScene()
은 서버/호스트 또는 마스터 클라이언트에서만 호출할 수 있습니다. (이는 기본 씬 관리자 구현에 의해 강제되며, 커스텀 구현도 이를 강제해야 합니다)
씬을 로드하려면, NetworkRunner.LoadScene()
을 호출하고 씬의 SceneRef
와 LoadSceneParameters
를 전달합니다. 단일 로드 모드(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);
}
SceneRef
는 SceneRef.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)
: 전달된 매개변수로 새로운 씬을 로드합니다. 씬 로드 방식은 개발자에 의해 결정되며, 새로 로드된NetworkObjects
를NetworkRunner.RegisterSceneObjects(SceneRef scene, NetworkObject[] objects, byte loadId = 0)
로 등록해야 합니다.NetworkSceneAsyncOp UnloadScene(SceneRef sceneRef)
: 씬을 언로드합니다.void OnSceneInfoChanged()
:NetworkRunner
의INetworkSceneInfo
가 변경될 때 호출됩니다. 이를 사용하여 클라이언트에서 씬 로드를 트리거 하십시오.SceneRef GetSceneRef(string sceneName)
: 주어진 씬 이름에 기반하여SceneRef
를 반환합니다.