플레이어
소개
Fusion의 'Player'는 Fusion에 플레이어 입력을 제공할 수 있는 NetworkRunner
를 가진 피어, 즉 전용 게임 세션 서버가 아닌 피어 유형을 말합니다.
이 문서에서는 플레이어 정보를 식별하고 액세스하는 다양한 방법에 대해 설명합니다.
PlayerRef
플레이어 제어 피어에 입력을 제공할 수 있는 각 NetworkRunner
는 PlayerRef
라는 고유 식별자와 연결됩니다. 플레이어에게 주어진 PlayerRef
는 식별자 역할만 할 뿐 플레이어별 데이터는 포함하지 않습니다.
PlayerRef
는 0과 PlayerCount
-1 사이의 값을 가진 인덱싱된 Fusion Player를 포함하는 구조체입니다. 인덱스는 플레이어가 게임 세션에 연결하는 순서로 할당됩니다.
호스트는 기본적으로 입력을 제공할 수 있는 기능을 가진 서버이므로 전용 게임 세션 서버와 달리 PlayerRef
도 제공됩니다. 호스트의 'PlayerRef
는 항상 PlayerCount
-1이 됩니다.
PlayerCount
이 값은 주어진 시간에 게임 세션에 연결할 수 있는 최대 플레이어 수입니다.
게임 세션당 기본 최대 PlayerCount
는 Simulation > Default Players
필드에 의해 NetworkProjectConfig
에셋에 전역적으로 정의됩니다.
새 게임 세션을 만들 때 PlayerCount
는 NetworkRunner.StartGame()
에 전달되는 널을 허용할 수 있는 StartGameArgs.PlayerCount
에 의해 결정됩니다. StartGameArgs.PlayerCount
의 값이 설정되지 않았으면(또는 null로 설정), 새 게임 세션은 NetworkProjectConfig
에서 Default Player
수를 사용합니다.
전용 서버에는 PlayerRef
가 없으며 플레이어를 나타내지 않으므로 PlayerCount
제한에 포함되지 않습니다. 즉, PlayerCount
가 4인 게임 세션은 다음을 지원합니다:
- 호스트 1개와 3개의 클라이언트
- 전용 서버 1대와 4개의 클라이언트
- 4개의 공유 모드 클라이언트
플레이어 객체 정의
플레이어 객체는 게임 세션의 각 PlayerRef
를 특정 NetworkObject
'아바타'와 연결하는 편리한 옵션입니다.
각 PlayerRef
는 정확히 하나의 NetworkObject
와 연결될 수 있습니다. 이 연결은 네트워크로 연결되고 모든 클라이언트에서 자동으로 복제됩니다.
PlayerRef
<-> NetworkObject
연결은 NetworkRunner.SetPlayerObject(PLayerRef, NetworkObject)
메소드를 이용하여 설정됩니다.
- 호스트 및 서버 모드: 플레이어 객체는 호스트/서버에서만 설정할 수 있습니다.
- 공유 모드: 각 플레이어는 자신의 플레이어 객체 연결만 설정할 수 있으며, 해당 플레이어는 연결할
NetworkObject
에 대한 상태 권한도 있어야 합니다.
모든 피어는 NetworkRunner.TryGetPlayerObject(PlayerRef, out NetworkObject)
메소드를 통해 특정 PlayerRef
와 연결된 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;
}
각 플레이어는 하나의 플레이어 객체를 가질 수 있습니다.
상태 권한
ServerMode
: 서버만 해당되며 게임 상태에 대한 상태 권한이 있는 플레이어는 없습니다.HostMode
: 호스트 플레이어는 서버를 나타내는 상태 권한을 가집니다.SharedMode
: 권한이 분산되어 플레이어 간에 공유됩니다. 모든 플레이어는 아직 상태 권한이 할당되지 않은 객체에 대해 상태 권한을 가질 수 있습니다. 객체가 생성되고NetworkObject.ReleaseStateAuthority()
및NetworkObject.RequestStateAuthority()
를 호출하여 변경될 때 상태 권한을 할당할 수 있습니다.
입력 권한
ServerMode
및HostMode
: 플레이어는 여러NetworkObjects
에 대한 입력 권한을 가질 수 있습니다. 플레이어가NetworkObjects
에 대한 입력 권한을 가질 때, 플레이어는 입력을 보낼 수 있고 서버는 해당 특정 객체에 대한 입력을 찾을 때 이를 포착합니다. 이것이 클라이언트에서 서버로의 주요 통신 방법입니다.SharedMode
: 입력은 로컬 클라이언트에서만 사용할 수 있으며 중앙 권한에는 전송되지 않습니다. 클라이언트는 객체에 대한 상태 권한을 가질 수 있으므로 입력을 직접 적용할 수 있습니다.
하나의 컴퓨터에 여러 로컬 플레이어
게임이 하나의 NetworkRunner
에서 둘 이상의 로컬 물리적 플레이어를 허용하는 경우(예: 온라인 플레이어와 결합), Fusion의 '플레이어' 개념과는 별개로 로컬 플레이어를 차별화하기 위한 게임별 로직이 필요합니다. 여러 로컬 플레이어의 모든 입력은 하나의 네트워크 입력 구조체를 사용하여 Fusion의 입력 시스템에 통합되어 모든 로컬 플레이어 입력에 대한 데이터를 저장해야 합니다.
참고:SetPlayerObject
또는 OnPlayerJoined
와 같이 PlayerRef
에 의존하는 기능을 사용할 때 로컬에 여러 플레이어가 있으면 추가적인 사용자 지정 로직이 필요합니다.