This document is about: FUSION 1
SWITCH TO

수정중인 페이지 입니다.

플레이어

소개

Fusion의 'Player'는 Fusion에 플레이어 입력을 제공할 수 있는 NetworkRunner를 가진 피어, 즉 전용 게임 세션 서버가 아닌 피어 유형을 말합니다.

이 문서에서는 플레이어 정보를 식별하고 액세스하는 다양한 방법에 대해 설명합니다.

PlayerRef

플레이어 제어 피어에 입력을 제공할 수 있는 각 NetworkRunnerPlayerRef라는 고유 식별자와 연결됩니다. 플레이어에게 주어진 PlayerRef는 식별자 역할만 할 뿐 플레이어별 데이터는 포함하지 않습니다.

PlayerRef는 0과 PlayerCount-1 사이의 값을 가진 인덱싱된 Fusion Player를 포함하는 구조체입니다. 인덱스는 플레이어가 게임 세션에 연결하는 순서로 할당됩니다.

호스트는 기본적으로 입력을 제공할 수 있는 기능을 가진 서버이므로 전용 게임 세션 서버와 달리 PlayerRef도 제공됩니다. 호스트의 'PlayerRef는 항상 PlayerCount-1이 됩니다.

PlayerCount

이 값은 주어진 시간에 게임 세션에 연결할 수 있는 최대 플레이어 수입니다.

게임 세션당 기본 최대 PlayerCountSimulation > Default Players 필드에 의해 NetworkProjectConfig 에셋에 전역적으로 정의됩니다.

새 게임 세션을 만들 때 PlayerCountNetworkRunner.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()를 호출하여 변경될 때 상태 권한을 할당할 수 있습니다.

입력 권한

  • ServerModeHostMode: 플레이어는 여러 NetworkObjects에 대한 입력 권한을 가질 수 있습니다. 플레이어가 NetworkObjects에 대한 입력 권한을 가질 때, 플레이어는 입력을 보낼 수 있고 서버는 해당 특정 객체에 대한 입력을 찾을 때 이를 포착합니다. 이것이 클라이언트에서 서버로의 주요 통신 방법입니다.
  • SharedMode: 입력은 로컬 클라이언트에서만 사용할 수 있으며 중앙 권한에는 전송되지 않습니다. 클라이언트는 객체에 대한 상태 권한을 가질 수 있으므로 입력을 직접 적용할 수 있습니다.

하나의 컴퓨터에 여러 로컬 플레이어

게임이 하나의 NetworkRunner에서 둘 이상의 로컬 물리적 플레이어를 허용하는 경우(예: 온라인 플레이어와 결합), Fusion의 '플레이어' 개념과는 별개로 로컬 플레이어를 차별화하기 위한 게임별 로직이 필요합니다. 여러 로컬 플레이어의 모든 입력은 하나의 네트워크 입력 구조체를 사용하여 Fusion의 입력 시스템에 통합되어 모든 로컬 플레이어 입력에 대한 데이터를 저장해야 합니다.

참고:SetPlayerObject 또는 OnPlayerJoined와 같이 PlayerRef에 의존하는 기능을 사용할 때 로컬에 여러 플레이어가 있으면 추가적인 사용자 지정 로직이 필요합니다.

Back to top