This document is about: FUSION 2
SWITCH TO

PlayerRef

개요

Fusion에서 'Player'는 NetworkRunner를 통해 플레이어 입력을 제공할 수 있는 모든 피어를 나타냅니다. 이는 전용 게임 세션 서버가 아닌 모든 피어를 포함합니다.

이 문서에서는 플레이어 정보를 식별하고 접근하는 다양한 방법을 소개합니다.

PlayerRef

플레이어 제어 피어에 대해 입력을 제공할 수 있는 각 NetworkRunnerPlayerRef라는 고유 식별자와 연결됩니다. PlayerRef는 단순히 식별자로 사용되며, 플레이어의 특정 데이터를 포함하지 않습니다.

PlayerCount

이 값은 특정 시간에 게임 세션에 연결될 수 있는 최대 플레이어 수를 나타냅니다.

기본 PlayerCount 값은 NetworkProjectConfig 에셋의 Simulation > Default Players 필드에서 전역적으로 정의됩니다.

새 게임 세션을 생성할 때, PlayerCountNetworkRunner.StartGame()에 전달된 StartGameArgs.PlayerCount 값으로 결정됩니다. 만약 StartGameArgs.PlayerCount가 값이 없거나(null) 설정되지 않은 경우, 새로운 게임 세션은 NetworkProjectConfig의 기본 플레이어 수(Default Players)를 사용합니다.

전용 서버는 PlayerRef를 가지지 않으며, 플레이어를 나타내지 않으므로 PlayerCount 제한에 포함되지 않습니다. 따라서 PlayerCount가 4인 게임 세션은 다음을 지원합니다:

  • 호스트 1명과 클라이언트 3명
  • 전용 서버 1개와 클라이언트 4명
  • 공유 모드 클라이언트 4명

플레이어 객체 정의

플레이어 객체는 게임 세션에서 각 PlayerRef를 특정 NetworkObject '아바타'와 연관시키는 편리한 선택적 방법입니다.

PlayerRef는 정확히 하나의 NetworkObject와 연관될 수 있습니다. 이 연관은 네트워크로 전파되며, 모든 클라이언트에서 자동으로 복제됩니다.

PlayerRefNetworkObject 간의 연관은 NetworkRunner.SetPlayerObject(PlayerRef, NetworkObject) 메서드를 사용하여 설정됩니다.

  • 호스트 및 서버 모드: 플레이어 객체는 호스트/서버만 설정할 수 있습니다.
  • 공유 모드: 각 플레이어는 자신만의 플레이어 객체 연관만 설정할 수 있으며, 해당 플레이어는 연관된 NetworkObject에 대해 상태 권한을 가져야 합니다.

특정 PlayerRef와 연관된 NetworkObject를 검색하려면 NetworkRunner.TryGetPlayerObject(PlayerRef, out NetworkObject) 메서드를 사용합니다.

C#

// On Player Joined, create and define a Player Object.
void OnPlayerJoined(PlayerRef player, NetworkRunner runner){

    if (Object.HasStateAuthority == false) return;

    var plObject = runner.Spawn(PlayerObjectPrefab);
    var plData = plObject.GetComponent<PlayerData>();

    //SetData defines the PlayerRef for that NB and a life amount.
    plData.SetData(player, 3);

    runner.SetPlayerObject(player, plObject)
}


// When desired, get the Player Object.

int GetPlayerLife(PlayerRef player){
    if (Runner.TryGetPlayerObject(player, out var plObject)){
        return plObject.GetComponent<PlayerData>().Lifes;
    }

    Debug.LogError("Player Object Not found")
    return 0;
}

상태 권한

NetworkObjectPlayerRef와 연결된 StateAuthority를 가집니다. StateAuthority는 네트워크 객체의 상태, 예를 들어 Networked Properties를 제어합니다. StateAuthority에서 Networked Property를 변경하면 해당 변경 내용이 네트워크를 통해 다른 클라이언트에 복제됩니다.

  • 호스트/서버 모드: 항상 서버/호스트가 상태 권한을 가지며, 플레이어는 게임 상태에 대해 상태 권한을 가지지 않습니다.
  • 공유 모드: 권한은 분산되어 있으며, 모든 플레이어가 네트워크 객체에 대한 상태 권한을 가질 수 있습니다. 상태 권한이 없는 객체나 Allow StateAuthorityOverride가 활성화된 네트워크 객체는 상태 권한을 가질 수 있습니다. 상태 권한은 객체가 생성될 때 할당되며, NetworkObject.ReleaseStateAuthority()NetworkObject.RequestStateAuthority()를 호출하여 변경될 수 있습니다.

입력 권한

StateAuthority 외에도 NetworkObjectInputAuthority를 가질 수 있습니다. 입력 권한은 공유/호스트 모드에서만 관련이 있습니다.

플레이어는 여러 NetworkObjects에 대해 입력 권한을 가질 수 있습니다. 플레이어가 특정 NetworkObject에 대해 입력 권한을 가지면, 해당 객체에 대한 입력을 서버에 보낼 수 있습니다. 서버는 해당 객체의 입력을 처리합니다. 입력에 대한 자세한 정보는 Player Input을 참고하십시오.

단일 기기에서 여러 로컬 플레이어

단일 NetworkRunner에서 여러 로컬 물리적 플레이어를 허용하는 경우(예: 소파 협동(co-op)과 온라인 플레이어가 결합된 경우), Fusion의 'Player' 개념과는 별도로 로컬 플레이어를 구별하기 위한 게임별 로직이 필요합니다. 여러 로컬 플레이어의 모든 입력은 하나의 네트워크 입력 구조를 사용하여 Fusion의 입력 시스템으로 통합되어야 합니다.

노트: 로컬 다중 플레이어가 있을 경우, SetPlayerObjectOnPlayerJoined와 같은 PlayerRef에 의존하는 함수 사용 시 추가적인 커스텀 로직이 필요합니다.

Back to top