このページは編集中です。更新が保留になっている可能性があります。

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

イントロダクション

リモートプロシージャコールは、単にRPCと呼ばれることもあり、時間に正確であることが求められるゲームイベントの共有に理想的です。Input Structや[Networked]プロパティが、ネットワーククライアント間で常に変わり続けるステートを共有する際の主力のソリューションであることと対照的です。

例えば、プレイヤーが入力権限のないオブジェクトに対して、まれに複雑なインタラクションを実行したい場合、例えば、インベントリから特定の鍵を使ってロックされたドアを開けるような場合です。 入力の一部として追加のフィールドも含み、技術的には可能なアクションだとしても、インプット構造体を壊し、使い物にならなくしてしまいます。 さらに、インプット構造体はアンリライアブルなメッセージとして送信されるため、パケットが失われる可能性があります。 入力がずっと必要な場合(キャラクターの動作など)、これに気づくことはほぼありませんが、プライヤーにとっては保証されるべきものである一度きりのアクションに影響すると、プレイヤーエクスペリエンスとしては悪いものになります。 このような状況で、リモートプロシージャコールがベストプラクティスとなります。

トップに戻る

セットアップ

FUSIONはRPC向けにシンプルながら強力なシンタックスを搭載しています。 RPCには一般的に3種類あるといわれています。

  1. インスタンスRPC;
  2. 静的RPCS;
  3. ターゲットRPC

これら3つのすべてについて、次のセクションでご説明します。

トップに戻る

インスタンスRPC

NetworkObject上のすべてのNetworkBehaviourのRPCを定義するには、以下のステップに従います。

  1. 戻りタイプがvoidである通常のCSharpメソッドを宣言する;
  2. メソッド宣言の前で[RPC] 属性を追加する
  3. RpcSourcesパラメータ とRpcTargetsパラメータを設定し、RPCが呼び出されるであろう元の場所と、実行される場所を制御する
[Rpc(source: RpcSources.InputAuthority, targets: RpcTargets.StateAuthority)]
public void RPC_Configure(string name, Color color){
    playerName = name;
    playerColor = color;
}

ROCは、Network Object > NetworkBehaviour > Networked State > Constraintsのエントリで説明されているタイプの制約に従います。

注意: RPCは、メソッド名に「rpc」というプリフィクスまたはポストフィクスを含める必要があります。(大文字小文字は認識しません。)

トップに戻る

静的RPC

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

-RpcSourcesパラメータとRpcTargetsパラメータを無視し、; - NetworkRunnerとなるためメソッドの初めのパラメータを要求する

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

トップに戻る

RPC属性パラメータ

ソースとターゲット

RpcSourcesRpcTargets はフィルターです。 RpcSourcesはRPCを送信できるピアを定義し、RpcTargetsは実行されるピアを定義します。

  • All: セッション内のすべてのピア(サーバーを含む)から送信・実行可能。
  • PROXIES:オブジェクトにインプット権限もステート権限も持たないピアにより送信・実行可能。
  • InputAuthority: オブジェクトにインプット権限を持つピアにより送信・実行可能。
  • StateAuthority: オブジェクトにステート権限を持つピアにより送信・実行可能。

重要: RPCには明示的なステートはありません。 RpcTargets.Allを設定しても、レイトジョインしたクライアントやには情報を送信されず、切断ののち再接続したクライアントは考慮されません。 そのため、RPCが以下のどちらかであることを確認することが大切です。

  • あらゆるステートなしで一時的であること(チャットメッセージなど)。または、
  • その効果をプロパティに間接的に記録すること。
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): RPCが再シミュレーションの間に起動されないようにする場合、trueに設定する
[Rpc (RpcSources.All, RpcTargets.All, InvokeLocal = true, InvokeResim = true )]
void RpcStartBoost(){
    m_BoostAnim.StartBoostAnimation();
}

トップに戻る

RPC メソッドパラメータ

RpcInfo

RPCメソッド 宣言 は、RpcInfoタイプのオプショナルパラメータをとる可能性があります。 これにより、RPCについての追加情報を確認できます。

  • Tick: どのティックで送信されたか。
  • Source: どのプレイヤー (PlayerRef)が送信したか。
  • Channel: UnreliableRPCまたはReliable RPCのどちらで送信されたか。
  • IsInvokeLocal: RPCをはじめに起動したのはローカルプレイヤーであったか。
[Rpc(source: RpcSources.InputAuthority, targets: RpcTargets.StateAuthority)]
public void RPC_Configure(string name, Color color, RpcInfo info = default){
    playerName = name;
    playerColor = color;
}

パラメータは 常に RpcInfo info = defaultとして宣言します。

トップに戻る

ターゲットRPC

RPCが特定のプレイヤーのマシン上で、限定的に実行されるべきである場合、ターゲットRPCというものを使用します。 [RpcTarget]属性で前書きしたPlayerRefパラメータを追加することで、インスタンスRPCと静的RPCの両方ともターゲットRPCになることができます。 典型的なユースケースは、メッセージが自分のチーム内の特定のプレイヤーに向けてのみ発信されるチームチャットです。

[Rpc(source: RpcSources.InputAuthority, targets: 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パラメータと宣言が 異なる メソッドの で使用されます。

ドキュメントのトップへ戻る