수정중인 페이지 입니다.

Remote Procedure Calls

소개

간단히 RPC라고 하는 원격 프로시저 호출은 정확한 게임 이벤트를 공유하는 데 이상적입니다. 이와 대조적으로 입력 구조체 및 [Networked] 속성은 지속적으로 변경되는 네트워크 클라이언트 간에 상태를 공유하는 데 필요한 솔루션입니다.

예를 들어 플레이어가 인벤토리의 특정 키를 사용하여 잠긴 문을 여는 등 입력 권한이 없는 개체와 드물지만 복잡한 상호 작용을 수행하려고 할 때입니다. 추가 필드를 입력의 일부로 포함하면 기술적으로 작업을 수행할 수 있지만, 입력 구조체가 혼란스럽고 다루기 어렵게 됩니다. 또한, 입력 구조체는 신뢰할 수 없는 메시지로 전송됩니다. 즉, 패킷이 손실될 수 있습니다. 이는 지속적인 입력(예: 캐릭터 이동)이 필요한 경우 거의 눈에 띄지 않지만 플레이어가 보장받을 것으로 예상되는 일회성 동작에 영향을 미칠 경우 플레이어 경험에 해로울 수 있습니다. 이러한 상황에서는 원격 프로시저 호출이 가장 좋습니다.

메인 화면으로

설정

Fusion은 간단하지만 강력한 RPC 용 구문을 가지고 있습니다. 실제로 말하는 RPC에는 세 가지 유형이 있습니다.

  1. 인스턴스 RPC
  2. 정적 RPC 및
  3. 대상 RPC.

이러한 유형 각각은 다음 섹션에서 설명됩니다.

메인 화면으로

인스턴스 RPC

NetworkBehaviourNetworkBehaviour에 RPC를 정의하려면 다음 단계를 수행하세요.

  1. 리턴 타입이 void인 일반적인 C# 메소드를 선언합니다.
  2. 메소드의 선언 앞에 [Rpc] 태그를 붙입니다.
  3. RPC를 호출할 수 있는 위치와 실행할 위치를 제어하기 위해 RpcSourcesRpcTargets 파라미터를 구성합니다.
[Rpc(source: RpcSources.InputAuthority, target: RpcTargets.StateAuthority)]
public void RPC_Configure(string name, Color color){
    playerName = name;
    playerColor = color;
}

RPC는 Network Object > NetworkBehaviour > Networked State > Constraints 항목에 설명된 형식 제약 조건을 따르는 모든 파라미터를 사용할 수 있습니다.

노트: 메소드에 RPC_ 접두사를 사용하면 코드 베이스에서 RPC를 쉽게 검색하고 식별할 수 있습니다.

메인 화면으로

정적 RPC

정적 RPC는 약간 다른 규칙을 갖고 있습니다:

  • RpcSourcesRpcTargets 파라미터를 무시하고
  • 메소드의 첫 번째 매개 변수는 NetworkRunner여야 합니다.
public static void Rpc_MyStaticRpc(NetworkRunner runner, int a) { }

메인 화면으로

RPC 속성 파라미터

소스 및 타겟

RpcSourcesRpcTargets는 필터입니다. RpcSources는 RPC를 전송할 수 있는 피어를 정의하는 반면, RpcTargets는 피어가 실행되는 피어를 정의합니다.

  • All: 전송할 수 있음 / 세션 내의 모든 피어에 의해서 실행됨(서버 포함).
  • Proxies: 전송할 수 있음 / 객체에 대하여 입력 권한 또는 상태 권한을 갖고 있지 않는 피어에 의해서 실행됨.
  • InputAuthority: 전송할 수 있음 / 객체에 대한 입력 권한이 있는 피어에 의해서 실행됨
  • StateAuthority: 전송할 수 있음 / 객체에 대한 상태 권한이 있는 피어에 의해서 실행됨.

중요: RPC에는 명시적 상태가 없습니다. RpcTargets.All로 설정하면 늦게 가입하는 클라이언트와 연결을 끊었다 다시 연결하는 클라이언트로 정보를 전달하지 않습니다. 따라서 RPC가 다음 중 하나인지 확인하는 것이 중요합니다.

  • 모든 상태가 없이 정말 투명 (예, 채팅 메시지) 또는
  • [Networked] 속성에서 간접적으로 기록된 효과를 갖고 있음.
public class Player : NetworkBehaviour {
    [Networked] public string playerName { get; set; }
    [Networked] public Color playerColor { get; set; }

    [Rpc(RpcSources.InputAuthority, RpcTargets.StateAuthority)]
    public void RPC_Configure(string name, Color color)    {
        playerName = name;
        playerColor = color;
    }
}

메인 화면으로

선택적인 RPC 속성 파라미터

RpcSourcesRpcTargets 속성 외에도 [Rpc] 속성은 몇 가지 선택적 파라미터를 제공합니다.

  • Channel (기본값 Reliable): 전송상에서 RPC가 없어질 수 있는 경우 Unreliable로 설정
  • InvokeLocal (기본값 true): RPC가 로컬 클라이언트에서 호출되지 않아야 하는 경우 false로 설정.
  • InvokeResim (기본값 false): 재시뮬레이션을 하는 동안 호출되지 않아야 하는 경우 true로 설정
[Rpc (RpcSources.All, RpcTargets.All, InvokeLocal = true, InvokeResim = true )]
void RpcStartBoost(){
    m_BoostAnim.StartBoostAnimation();
}

메인 화면으로

RPC 메소드 파라미터

RpcInfo

RPC 메소드 선언RpcInfo 타입의 선택적인 파라미터를 받을 수 있습니다. 이렇게 하면 RPC에 대한 추가 정보를 읽을 수 있습니다.

  • Tick: 어떤 곳에서 틱이 전송되었는지.
  • Source: 어떤 플레이어(PlayerRef)가 보냈는지.
  • Channel: Unreliable 또는 Reliable RPC로 보냈는지 여부.
  • IsInvokeLocal: 이 RPC를 원래 호출한 로컬 플레이어인지의 여부.
[Rpc(source: RpcSources.InputAuthority, target: RpcTargets.StateAuthority)]
public void RPC_Configure(string name, Color color, RpcInfo info = default){
    playerName = name;
    playerColor = color;
}

매개 변수는 항상 RpcInfo info = default로 선언됩니다.

메인 화면으로

대상 Rpc

RPC가 특정 플레이어의 컴퓨터에서 단독으로 실행되어야 하는 경우, 이른바 대상 RPC가 사용됩니다. 인스턴스 RPC와 정적 RPC는 모두 [RpcTarget] 속성 앞에 있는 PlayerRef 매개 변수를 추가하여 대상 RPC로 전환할 수 있습니다. 일반적인 사용 사례는 메시지가 소속 팀의 특정 선수에게만 제공되는 팀 채팅입니다.

[Rpc(source: RpcSources.InputAuthority, target: RpcTargets.StateAuthority)]
public void Rpc_TargetedInstanceMessage([RpcTarget] PlayerRef player, string message){}

public static void Rpc_MyTargetedStaticMessage(NetworkRunner runner, [RpcTarget] PlayerRef player, string message) { };

중요: 메소드 에서 [RpcTarget]으로 선언된 속성은 메소드 선언의 에 위치한 [Rpc] 속성 내의 RpcTargets 파라미터와 다릅니다.

기술문서 TOP으로 돌아가기