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
를 변경하면 해당 변경 내용이 네트워크를 통해 다른 클라이언트에 복제됩니다.
- 호스트/서버 모드: 항상 서버/호스트가 상태 권한을 가지며, 플레이어는 게임 상태에 대해 상태 권한을 가지지 않습니다.
- 공유 모드: 권한은 분산되어 있으며, 모든 플레이어가 네트워크 객체에 대한 상태 권한을 가질 수 있습니다. 상태 권한이 없는 객체나
Allow StateAuthorityOverride
가 활성화된 네트워크 객체는 상태 권한을 가질 수 있습니다. 상태 권한은 객체가 생성될 때 할당되며,NetworkObject.ReleaseStateAuthority()
및NetworkObject.RequestStateAuthority()
를 호출하여 변경될 수 있습니다.
입력 권한
StateAuthority
외에도 NetworkObject
는 InputAuthority
를 가질 수 있습니다. 입력 권한은 공유/호스트 모드
에서만 관련이 있습니다.
플레이어는 여러 NetworkObjects
에 대해 입력 권한을 가질 수 있습니다. 플레이어가 특정 NetworkObject
에 대해 입력 권한을 가지면, 해당 객체에 대한 입력을 서버에 보낼 수 있습니다. 서버는 해당 객체의 입력을 처리합니다. 입력에 대한 자세한 정보는 Player Input을 참고하십시오.
단일 기기에서 여러 로컬 플레이어
단일 NetworkRunner
에서 여러 로컬 물리적 플레이어를 허용하는 경우(예: 소파 협동(co-op)과 온라인 플레이어가 결합된 경우), Fusion의 'Player' 개념과는 별도로 로컬 플레이어를 구별하기 위한 게임별 로직이 필요합니다. 여러 로컬 플레이어의 모든 입력은 하나의 네트워크 입력 구조를 사용하여 Fusion의 입력 시스템으로 통합되어야 합니다.
노트: 로컬 다중 플레이어가 있을 경우, SetPlayerObject
나 OnPlayerJoined
와 같은 PlayerRef
에 의존하는 함수 사용 시 추가적인 커스텀 로직이 필요합니다.