PlayerRef
개요
Fusion에서 'Player'는 NetworkRunner
를 통해 플레이어 입력을 제공할 수 있는 모든 피어를 나타냅니다. 이는 전용 게임 세션 서버가 아닌 모든 피어를 포함합니다.
이 문서에서는 플레이어 정보를 식별하고 접근하는 다양한 방법을 소개합니다.
PlayerRef
플레이어 제어 피어에 대해 입력을 제공할 수 있는 각 NetworkRunner
는 PlayerRef
라는 고유 식별자와 연결됩니다. PlayerRef
는 단순히 식별자로 사용되며, 플레이어의 특정 데이터를 포함하지 않습니다.
PlayerCount
이 값은 특정 시간에 게임 세션에 연결될 수 있는 최대 플레이어 수를 나타냅니다.
기본 PlayerCount
값은 NetworkProjectConfig
에셋의 Simulation > Default Players
필드에서 전역적으로 정의됩니다.
새 게임 세션을 생성할 때, PlayerCount
는 NetworkRunner.StartGame()
에 전달된 StartGameArgs.PlayerCount
값으로 결정됩니다. 만약 StartGameArgs.PlayerCount
가 값이 없거나(null) 설정되지 않은 경우, 새로운 게임 세션은 NetworkProjectConfig
의 기본 플레이어 수(Default Players
)를 사용합니다.
전용 서버는 PlayerRef
를 가지지 않으며, 플레이어를 나타내지 않으므로 PlayerCount
제한에 포함되지 않습니다. 따라서 PlayerCount
가 4인 게임 세션은 다음을 지원합니다:
- 호스트 1명과 클라이언트 3명
- 전용 서버 1개와 클라이언트 4명
- 공유 모드 클라이언트 4명
플레이어 객체 정의
플레이어 객체는 게임 세션에서 각 PlayerRef
를 특정 NetworkObject
'아바타'와 연관시키는 편리한 선택적 방법입니다.
각 PlayerRef
는 정확히 하나의 NetworkObject
와 연관될 수 있습니다. 이 연관은 네트워크로 전파되며, 모든 클라이언트에서 자동으로 복제됩니다.
PlayerRef
와 NetworkObject
간의 연관은 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;
}
상태 권한
각 NetworkObject
는 PlayerRef
와 연결된 StateAuthority
를 가집니다. StateAuthority
는 네트워크 객체의 상태, 예를 들어 Networked Properties
를 제어합니다. StateAuthority
에서 Networked Property
를 변경하면 해당 변경 내용이 네트워크를 통해 다른 클라이언트에 복제됩니다.
모든 플레이어는 상태 권한이 아직 할당되지 않았거나, 네트워크 객체(NetworkObject)에 Allow StateAuthorityOverride
가 활성화된 경우 상태 권한을 가질 수 있습니다. 상태 권한은 객체가 생성될 때 할당되며, NetworkObject.ReleaseStateAuthority()
와 NetworkObject.RequestStateAuthority()
를 호출하여 변경될 수 있습니다.