원격 프로시저 호출
소개
RPC(원격 프로시저 호출)는 특정 이벤트를 네트워크 클라이언트 간에 공유하기에 이상적입니다. 반면에, [Networked]
속성은 지속적으로 변하는 상태를 공유하는 데 적합한 기본 솔루션입니다.
RPC 생성
NetworkObject
의 NetworkBehaviour
에서 RPC를 정의하려면 다음 단계를 따르세요:
- 반환 타입이
void
또는RpcInvokeInfo
인 일반 C# 메서드를 선언합니다(아래 문서화됨). - 메서드 이름 앞뒤에 "RPC"를 추가합니다(대소문자 구분 없음).
- 메서드 선언 앞에
[Rpc]
속성을 추가합니다. RpcSources
및RpcTargets
매개변수를 설정하여 RPC 호출 위치와 실행 위치를 제어합니다.
C#
[Rpc(sources: RpcSources.InputAuthority, targets: RpcTargets.StateAuthority)]
public void RPC_Configure(string name, Color color){
playerName = name;
playerColor = color;
}
RPC는 작동하려면 메서드 이름에 "RPC" 접두사 또는 접미사가 필요합니다.
정적 RPC
정적 RPC는 약간의 다른 규칙을 따릅니다:
RpcSources
및RpcTargets
매개변수를 무시합니다.- 메서드의 첫 번째 매개변수는
NetworkRunner
여야 합니다.
정적 RPC는 소스와 대상 필터가 없기 때문에 모든 클라이언트에서 호출될 수 있으며 모든 클라이언트로 전송됩니다. 그러나 특정 PlayerRef
를 대상으로 지정하여 호출 대상을 제어할 수 있습니다(Targeted RPC 참조).
C#
[Rpc]
public static void Rpc_MyStaticRpc(NetworkRunner runner, int a) { }
RPC 속성 매개변수
Sources와 Targets
RpcSources
와 RpcTargets
는 필터 역할을 합니다. RpcSources
는 RPC를 보낼 수 있는 피어를 정의하고, RpcTargets
는 실행될 피어를 정의합니다.
All
: 세션 내 모든 피어(해당 RPC를 호출한 클라이언트를 포함)가 보낼 수 있으며, 실행됩니다.Proxies
: 해당 객체에 상태 권한(State Authority)이 없는 피어가 보낼 수 있으며, 실행됩니다.StateAuthority
: 해당 객체에 상태 권한(State Authority)을 가진 피어가 보낼 수 있으며, 실행됩니다.
중요: RPC는 명시적 상태를 가지지 않습니다. 늦게 접속한 클라이언트와 연결이 끊긴 후 다시 연결된 클라이언트는 RPC가 발생한 사실을 잊게 됩니다. 따라서 RPC는 반드시 다음 중 하나를 보장해야 합니다:
- 실제로 상태를 가지지 않는 일시적인 작업(예: 채팅 메시지)일 것.
- 또는, 간접적으로
[Networked]
속성에 효과를 기록할 것.
C#
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에서 지원되는 타입은 다음과 같습니다:
- 기본 타입(Primitives): byte, short, int, long, ushort, uint, ulong, float, double, bool
- 유니티 타입: Vector2, Vector3, Vector4, Quaternion, Vector2Int, Vector3Int, Rect, RectInt Color, Color32
- Fusion 타입: NetworkObject, NetworkBehaviour, NetworkString<>, NetworkBool, Angle, NetworkId, PlayerRef, SceneRef, TickTimer
- Strings
- 구조체 INetworkStruct 구현
- 배열 지원 타입. 예.
Int[]
.
타겟팅 된 RPC
특정 플레이어의 기계에서만 실행되도록 RPC를 설정하려면 타겟팅 된 RPC를 사용합니다. 인스턴스 RPC와 정적 RPC 모두 PlayerRef
매개변수를 추가하고 [RpcTarget]
속성을 사용하여 타겟팅 된 RPC로 전환할 수 있습니다. 일반적인 사용 사례는 팀 채팅으로, 메시지가 자신의 팀원에게만 전달되는 경우입니다.
C#
[Rpc(sources: RpcSources.InputAuthority, targets: RpcTargets.All)]
public void Rpc_TargetedInstanceMessage([RpcTarget] PlayerRef player, string message){}
또는
C#
[Rpc(sources: RpcSources.InputAuthority, targets: RpcTargets.All)]
public static void Rpc_MyTargetedStaticMessage(NetworkRunner runner, [RpcTarget] PlayerRef player, string message) { };
메서드 내에서 사용하는 [RpcTarget]
속성은 메서드 선언 앞에 있는 [Rpc]
속성의 RpcTargets
매개변수와는 다릅니다.