Remote Procedure Calls
소개
간단히 RPC라고 하는 원격 프로시저 호출은 정확한 게임 이벤트를 공유하는 데 이상적입니다. 이와 대조적으로 입력 구조체 및 [Networked]
속성은 지속적으로 변경되는 네트워크 클라이언트 간에 상태를 공유하는 데 필요한 솔루션입니다.
예를 들어 플레이어가 인벤토리의 특정 키를 사용하여 잠긴 문을 여는 등 입력 권한이 없는 개체와 드물지만 복잡한 상호 작용을 수행하려고 할 때입니다. 추가 필드를 입력의 일부로 포함하면 기술적으로 작업을 수행할 수 있지만, 입력 구조체가 혼란스럽고 다루기 어렵게 됩니다. 또한, 입력 구조체는 신뢰할 수 없는 메시지로 전송됩니다. 즉, 패킷이 손실될 수 있습니다. 이는 지속적인 입력(예: 캐릭터 이동)이 필요한 경우 거의 눈에 띄지 않지만 플레이어가 보장받을 것으로 예상되는 일회성 동작에 영향을 미칠 경우 플레이어 경험에 해로울 수 있습니다. 이러한 상황에서는 원격 프로시저 호출이 가장 좋습니다.
설정
Fusion은 간단하지만 강력한 RPC 용 구문을 가지고 있습니다. 실제로 말하는 RPC에는 세 가지 유형이 있습니다.
- 인스턴스 RPC
- 정적 RPC 및
- 대상 RPC.
이러한 유형 각각은 다음 섹션에서 설명됩니다.
인스턴스 RPC
NetworkBehaviour
의 NetworkBehaviour
에 RPC를 정의하려면 다음 단계를 수행하세요.
- 리턴 타입이
void
인 일반적인 C# 메소드를 선언합니다. - 메소드의 선언 앞에
[Rpc]
태그를 붙입니다. - RPC를 호출할 수 있는 위치와 실행할 위치를 제어하기 위해
RpcSources
와RpcTargets
파라미터를 구성합니다.
[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는 약간 다른 규칙을 갖고 있습니다:
RpcSources
와RpcTargets
파라미터를 무시하고- 메소드의 첫 번째 매개 변수는
NetworkRunner
여야 합니다.
public static void Rpc_MyStaticRpc(NetworkRunner runner, int a) { }
RPC 속성 파라미터
소스 및 타겟
RpcSources
와 RpcTargets
는 필터입니다. 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 속성 파라미터
RpcSources
및 RpcTargets
속성 외에도 [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
파라미터와 다릅니다.