집게사장의 꿈

Fusion 기본 정보 본문

유니티/Fusion

Fusion 기본 정보

Krapboss 2024. 6. 6. 05:13
StateAuthority

 

* NetworkBehavior 을 상속받은 객체

Object.StateAuthority = StateAuthority

NetworkObject
SimulationBehaviour
NetworkBehaviour

 

! 씬에 존재하는 네트워 오브젝트는 제일 처음 불러온 플레이어가 권한을 가진다.
권한을 가진 오브젝트가 생성을 하게되면 생성된 오브젝트의 권한도 가져온다.

 

NetworkObject

 

구성 요소 개요
네트워크 개체는 NetworkObject 구성 요소가 있는 게임 개체이며 Room의 단일 네트워크 개체를 나타냅니다.


네트워크 ID
서버는 Room에 있는 해당 개체에 대한 고유한 정수 식별자인 NetworkId 값을 NetworkObject 구성 요소에 할당합니다. 이 NetworkId는 모든 피어에서 일관되며 네트워크의 개체를 참조하는 데 사용됩니다.
로컬 네트워크 개체 인스턴스는 NetworkRunner.TryFindObject()를 호출하여 이 NetworkId를 통해 찾을 수 있습니다.

각 NetworkObject는 고유 ID를 가지고 있다

생성
Runner.Spawn() 호출
Spawn이 호출되면 NetworkObject 구성 요소가 포함된 GameObject가 생성되고 Spawn 작업이 네트워크에 복제됩니다. Runner.StartGame()에 전달된 INetworkObjectProvider에는 생성된 객체가 생성되는 방식(프리팹 인스턴스화, 기존 객체 복제, 코드를 사용하여 새 사용자 정의 객체 생성, 풀에서 객체 가져오기)에 대한 구현이 포함되어 있습니다.

조립식/객체 테이블
네트워크 개체 생성에는 일반적으로 인스턴스화에 사용되는 Prefab 인스턴스 전달이 포함됩니다. Prefab 매개변수가 Fusion에 적합하도록(그리고 모든 클라이언트가 정확히 어떤 프리팹인지에 대해 동의하는지 확인하려면) 프리팹 자체를 Fusion에 등록해야 합니다. 일반적인 상황에서 Fusion 도구 세트는 이러한 프리팹을 자동으로 감지하고 등록하지만, NetworkProjectConfig를 선택하고 Unity Inspector에서 Rebuild Object Table을 눌러 이 감지를 수동으로 트리거할 수도 있습니다.

런타임 시 NetworkBehaviour 추가/제거할 수 없음

  • 예외적으로 굽는다면 가능

    장면 네트워크 객체 로드
    장면과 함께 네트워크 객체를 로드하는 것은 객체를 생성하고 연결하는 또 다른 방법입니다. ISceneManager 인스턴스(장면 관리 참조)를 사용하여 장면이 로드되면 장면에서 활성화된 모든 네트워크 개체가 서버(서버 모드) 또는 마스터 클라이언트(공유 모드)에 연결됩니다. 그런 다음 각 장면 개체에 할당된 NetworkId가 다른 모든 클라이언트에 전달되고 해당 클라이언트는 로드된 장면 개체를 연결하고 해당 NetworkId 값을 할당합니다.

    부착
  • NetworkBehaviour 구성 요소의 네트워크 속성에 메모리를 할당하고, 연결된 모든 NetworkBehaviour를 초기화하는 프로세스
  • 일단 연결되면 NetworkObject는 모든 하위 네트워크 동작에서 Spawned()를 호출
  • 연결은 네트워크 개체에 NetworkId를 할당
  • 모든 Spawned() 메서드가 호출되면 네트워크 개체는 유효한 것으로 간주되며 해당 네트워크 속성 및 RPC 메서드는 유효하고 액세스 가능


연결된 모든 네트워크 개체에는 PlayerRef에 의해 지정된 명시적 또는 묵시적 상태 권한 존재

Runner.StateAuthority 값이 PlayerRef.None이면 서버 피어가 묵시적 상태

서버 모드(호스트/전용/단일)
Runner.StateAuthority는 항상 PlayerRef.None

서버는 항상 State Authority이기 때문


공유 서버 모드
Runner.StateAuthority는 항상 유효한 PlayerRef입니다. 주체 변경에는 제한이 있음
플레이어는 Object.RequestStateAuthority()를 호출하여 권한을 획득할 수 있습니다.
RequestStateAuthority()는 다음과 같은 경우에만 성공

NetworkObject.AllowStateAuthorityOverride가 true로 설정되었습니다. 또는
이전 주체에서는 Object.ReleaseStateAuthority()를 호출했습니다.


입력 권한
입력 권한은 서버 모드(호스트, 전용, 단일)에만 해당

 

 

 

NetworkBehaviour 의 고유한
NetworkBehaviourId 구조체

 

NetworkBehaviour instance에 대한 고유 ID를 사용

구조체 이지만 내부에 Operation이 구현되어 있어서 비교연산 가능

 

 

 

두 ID의 차이

 

b = NetworkBehaviour 의 NetworkBehaviourId

- NetworkBehaviour 의 고유 ID

a = NetworkObject.NetworkId

- NetworkObject의 고유 ID

해당 객체가 속한 네트워크 ID