This document is about: FUSION 2-SHARED
SWITCH TO

リモートプロシージャコール

概要

リモートプロシージャコール(RPC)は、単発のゲームイベントの共有に最適です。一方、入力とネットワークプロパティは、クライアント間で継続的に変化する状態を共有する主力の方法になります。

RPCの作成

ネットワークオブジェクトのNetworkBehaviourでRPCを定義するには、以下のステップに従います。

  1. voidまたはRpcInvokeInfo(後述)を返す通常のC#メソッドを宣言する
  2. メソッド名の接頭辞または接尾辞に「RPC」(大文字小文字を区別しない)を付ける
  3. [Rpc]属性をメソッド宣言の前に追加する
  4. RpcSourcesRpcTargetsを設定して、誰がRPCが呼び出し誰がRPCを実行するのかを制御する

C#

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

RPCを動作させるには、メソッド名の接頭辞か接尾辞に「RPC」を付ける必要があります。

静的RPC

静的RPCは、わずかに異なるルールに従います。

  • RpcSourcesRpcTargetsは無視されます
  • メソッドの最初の引数にNetworkRunnerが必要です

RpcSourcesRpcTargetsが無いため、静的RPCは、どのクライアントでも呼び出し可能で、全てのクライアントに送信されます。ターゲットRPCにすれば、特定のPlayerRefを指定して、誰がRPCを受信するかを制御できます。

C#

[Rpc]
public static void Rpc_MyStaticRpc(NetworkRunner runner, int a) { }

RPC属性のパラメーター

ソースとターゲット

RpcSourcesRpcTargetsはフィルターで、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) { };
Important

メソッド宣言の中で使用する[RpcTarget]属性と、メソッド宣言の前に追加する[Rpc]属性のRpcTargetsパラメーターは、別物です。

Back to top