플레이어
소개
플레이어
Fusion의 '플레이어'는 Fusion에 플레이어 입력을 제공할 수 있는 모든 피어를 의미합니다. 일반적으로 서버 이외의 모든 피어 유형입니다. 각 NetworkRunner
는 하나의 PlayerRef
와만 연결됩니다. 만약 게임이 하나의 NetworkRunner
에서 둘 이상의 로컬 물리 플레이어를 허용한다면(예를 들어, 온라인 플레이어와 결합된 카우치 협동 작업), Fusion의 '플레이어' 개념과 무관하게 로컬 플레이어를 차별화하기 위한 게임별 로직이 필요할 것입니다. 여러 로컬 플레이어로부터의 모든 입력은 Fusion의 입력 시스템에 통합되어야 하며, 단일 네트워크 입력 구조를 사용하여 모든 로컬 플레이어 입력에 대한 데이터를 보유해야 합니다.
노트:'SetPlayerObject
또는 OnPlayerJoined
'와 같은 PlayerRef
에 의존하는 함수를 사용할 때 로컬 다중 플레이어가 있으면 추가 사용자 지정 로직이 필요합니다.
노트:서버는 호스트인 경우 최대 PlayerCount
에 대한 플레이어로만 계산됩니다. 게임의 최대 플레이어 수가 10인 경우 10개의 클라이언트 플레이어와 전용 서버(호스트 이외)를 지원하여 11개의 피어를 만들 수 있습니다.
PlayerRef
PlayerRef
구조체는 값이 0에서 PlayerCount
-1 사이의 인덱싱된 Fusion 플레이어/피어를 나타냅니다. 호스트(PlayerRef가 있는 서버)는 항상 PlayerRef 값이 PlayerCount
-1입니다.
노트: PlayerRef
는 식별자이며, 다른 플레이어의 특정 데이터를 갖고 있지 않습니다.
노트: PlayerCount
는 StartGameArgs
passed to the NetworkRunner.StartGame()
메소드로 전달되는 StartGameArgs
에 의해 정의됩니다.
플레이어 객체 정의
플레이어 객체는 게임 내 각 PlayerRef
를 NetworkObject
'아바타'와 연결할 수 있는 옵션입니다.
각 PlayerRef
는 하나의 NetworkObject
와 연결될 수 있습니다. 이 연결은 클라이언트에 자동으로 연결됩니다.
다음 메소드를 사용하여 PlayerRef
<-> NetworkObject
연결을 설정합니다:
NetworkRunner.SetPlayerObject(PLayerRef, NetworkObject)
- 서버 모드: 플레이어 객체 연결은 서버에 의해서만 설정될 수 있습니다
- 공유 모드: 각 플레이어는 자신의 플레이어 객체 연결만 설정할 수 있으며, 해당 플레이어는 연결된
NetworkObject
에 대한 상태 권한도 가지고 있어야 합니다.
다음 메소드를 사용하여 피어는PlayerRef
에 연결되어 있는 NetworkObject
를 얻을 수 있습니다:
NetworkRunner.TryGetPlayerObject(PlayerRef, out NetworkObject)
// On Player Joined, create and define a Player Object.
void OnPlayerJoined(PLayerRef player, NetworkRunner runner){
if (runner.IsClient)
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.ReleaseStateAuthority()
및 NetworkObject.RequestStateAuthority()
를 조작하거나 객체 스폰을 통해서 달성할 수 있습니다.
입력 권한 갖기
플레이어는 여러 개의 NetworkObjects
에 대해 입력 권한을 가질 수 있습니다.
호스트/서버 모드
플레이어가 NetworkObject
에 대한 입력 권한을 가지고 있으면 입력을 전송할 수 있으며 서버는 특정 객체에 대한 입력을 찾을 때 해당 입력을 캐치합니다. 이것이 클라이언트에서 서버로 통신하는 주요 방식입니다.
공유 모드
공유 모드에서는 입력이 사용되지 않습니다. 클라이언트는 객체에 대한 상태 권한을 가질 수 있으므로 입력을 직접 적용할 수 있습니다.