リモートプロシージャコール
イントロダクション
リモートプロシージャコールは、単にRPCと呼ばれることもあり、時間に正確であることが求められるゲームイベントの共有に理想的です。Input Structや[Networked]
プロパティが、ネットワーククライアント間で常に変わり続けるステートを共有する際の主力のソリューションであることと対照的です。
例えば、プレイヤーが入力権限のないオブジェクトに対して、まれに複雑なインタラクションを実行したい場合、例えば、インベントリから特定の鍵を使ってロックされたドアを開けるような場合です。 入力の一部として追加のフィールドも含み、技術的には可能なアクションだとしても、インプット構造体を壊し、使い物にならなくしてしまいます。 さらに、インプット構造体はアンリライアブルなメッセージとして送信されるため、パケットが失われる可能性があります。 入力がずっと必要な場合(キャラクターの動作など)、これに気づくことはほぼありませんが、プライヤーにとっては保証されるべきものである一度きりのアクションに影響すると、プレイヤーエクスペリエンスとしては悪いものになります。 このような状況で、リモートプロシージャコールがベストプラクティスとなります。
セットアップ
FUSIONはRPC向けにシンプルながら強力なシンタックスを搭載しています。 RPCには一般的に3種類あるといわれています。
- インスタンスRPC;
- 静的RPCS;
- ターゲットRPC
これら3つのすべてについて、次のセクションでご説明します。
インスタンスRPC
NetworkObject
上のすべてのNetworkBehaviour
のRPCを定義するには、以下のステップに従います。
- 戻りタイプが
void
である通常のCSharpメソッドを宣言する; - メソッド宣言の前で
[RPC]
属性を追加する RpcSources
パラメータ とRpcTargets
パラメータを設定し、RPCが呼び出されるであろう元の場所と、実行される場所を制御する
C#
[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
となるためメソッドの初めのパラメータを要求する
C#
public static void Rpc_MyStaticRpc(NetworkRunner runner, int a) { }
RPC属性パラメータ
ソースとターゲット
RpcSources
とRpcTargets
はフィルターです。 RpcSources
はRPCを送信できるピアを定義し、RpcTargets
は実行されるピアを定義します。
All
: セッション内のすべてのピア(サーバーを含む)から送信・実行可能。PROXIES
:オブジェクトにインプット権限もステート権限も持たないピアにより送信・実行可能。InputAuthority
: オブジェクトにインプット権限を持つピアにより送信・実行可能。StateAuthority
: オブジェクトにステート権限を持つピアにより送信・実行可能。
重要: RPCには明示的なステートはありません。 RpcTargets.All
を設定しても、レイトジョインしたクライアントやには情報を送信されず、切断ののち再接続したクライアントは考慮されません。 そのため、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属性パラメータ
必須のRpcSources
プロパティとRpcTargets
プロパティに加えて、[Rpc]
属性はいくつかのオプションパラメータを提供しています。
Channel
(デフォルトはReliable
): RPCが送信中に失われる可能性がある場合、Unreliable
に設定するInvokeLocal
(デフォルトは true): RPCがローカルクライアントで起動されないようにする場合、falseに設定するInvokeResim
(デフォルトはfalse): RPCが再シミュレーションの間に起動されないようにする場合、trueに設定する
C#
[Rpc (RpcSources.All, RpcTargets.All, InvokeLocal = true, InvokeResim = true )]
void RpcStartBoost(){
m_BoostAnim.StartBoostAnimation();
}
RPC メソッドパラメータ
RPCはランタイム時にシリアル化されます。そのため、Fusion特有のもの(例:NetworkBool
)に通常のCLRタイプ(例:bool
)を使用することを推奨します。
RpcInfo
RPCメソッド 宣言 は、RpcInfo
タイプのオプショナルパラメータをとる可能性があります。 これにより、RPCについての追加情報を確認できます。
Tick
: どのティックで送信されたか。Source
: どのプレイヤー (PlayerRef
)が送信したか。Channel
:Unreliable
RPCまたはReliable
RPCのどちらで送信されたか。IsInvokeLocal
: RPCをはじめに起動したのはローカルプレイヤーであったか。
C#
[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になることができます。 典型的なユースケースは、メッセージが自分のチーム内の特定のプレイヤーに向けてのみ発信されるチームチャットです。
C#
[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
パラメータと宣言が 異なる メソッドの 中 で使用されます。