リモートプロシージャコール
概要
リモートプロシージャコール(RPC)は、単発のゲームイベントの共有に最適です。一方、入力とネットワークプロパティは、クライアント間で継続的に変化する状態を共有する主力の方法になります。
RPCの作成
ネットワークオブジェクトのNetworkBehaviour
でRPCを定義するには、以下のステップに従います。
void
またはRpcInvokeInfo
(後述)を返す通常のC#メソッドを宣言する- メソッド名の接頭辞または接尾辞に「RPC」(大文字小文字を区別しない)を付ける
[Rpc]
属性をメソッド宣言の前に追加するRpcSources
とRpcTargets
を設定して、誰がRPCが呼び出し誰が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
が必要です
RpcSources
とRpcTargets
が無いため、静的RPCは、どのクライアントでも呼び出し可能で、全てのクライアントに送信されます。ターゲットRPCにすれば、特定のPlayerRef
を指定して、誰がRPCを受信するかを制御できます。
C#
[Rpc]
public static void Rpc_MyStaticRpc(NetworkRunner runner, int a) { }
RPC属性のパラメーター
ソースとターゲット
RpcSources
とRpcTargets
はフィルターで、RpcsSources
はどのピアがRPCを送信できるかを定義し、RpcTargets
はどのピアがRPCを実装するのかを定義します。
All
:セッション内の全てのピア(RPCを呼び出したクライアント含む)で送信・実行できますProxies
:オブジェクトの状態権限を持たないピアで送信・実行できますStateAuthority
:オブジェクトの状態権限者で送信・実行できます
重要: RPCは明示的な状態を持ちません。途中参加したクライアントや、一度セッションを切断して再接続したクライアントでは、RPCの実行結果が無視されることがあります。そのため、以下のどちらかの点を保証することが非常に重要です。
- 本当に一時的なイベントで、状態を持たない(例:チャットメッセージ)
- 実行結果が間接的にネットワークプロパティに記録される
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
- Unity Types: Vector2, Vector3, Vector4, Quaternion, Vector2Int, Vector3Int, Rect, RectInt Color, Color32
- Fusion Types: NetworkObject, NetworkBehaviour, NetworkString<>, NetworkBool, Angle, NetworkId, PlayerRef, SceneRef, TickTimer
- Strings
- Structs implementing INetworkStruct
- Arrays of supported types. E.g.
Int[]
.
ターゲットRPC
ターゲットRPCは、特定のプレイヤーでのみRPCを実行したい場合に使用します。[RpcTarget]
属性で始まるPlayerRef
パラメーターを追加することで、インスタンスRPCも静的RPCもどちらも、ターゲット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
パラメーターは、別物です。