RPC

正確で自然なマルチプレイヤー体験を実現するためには、アクターのプロパティ、状態、および場所を同期することが重要です。しかし、プレイヤーが実行するアクションも同期する必要があります。

値をポーリングして、それが変化し特定のアクションが必要になったかどうかを確認することも可能ですが、ほとんどの場合、他のプレイヤーが適切な関数を呼び出せるようにアクションを伝える方が有効です。

RPC(遠隔手続き呼び出し)は、プレイヤー間で送信されるメッセージで、関数の署名と、必要なら引数が含まれています。これを用いて、他のプレイヤーのワールドにあるアクターのメソッドを直接呼び出すことができます。

Strixでは、RPC関連の一連の関数を用いてこれを行います。

../_images/rpc9.png

RPCの登録

注釈

RPCの登録は、オーナーとレプリカの両方のアクターで行う必要があります。

アクターブループリントの関数はRPC関数として登録できます。登録された関数の関数名を含むRPCメッセージを受信すると、その関数が呼び出されます。

登録はRegister Strix RPC関数を呼び出せば完了です。

Register Strix RPC関数は、Strix Replicatorコンポーネントが提供するOn Sync Beginイベントで呼び出す必要があります(複製を参照)。こうすることで、内部のネットワークオブジェクトやこのアクターのタイプIDが正しく作成済みであることを保証できます。

Register Strix RPC関数は、次の引数を取ります。

Target

アクターのオブジェクト参照

RPCの受信者として登録するアクター。
登録した関数のRPCを受信すると、このアクターが関数呼び出しのターゲットになります。
デフォルトはselfです。

Function Name

String

登録する関数のUEでの名前。マイブループリントパネルの関数の下に表示されるものです。
Targetに指定したオブジェクトで利用可能でなければならず、名前は文字列として完全一致しなければなりません。

RPCの送信方法

アクターがRPC用に関数を登録している場合、そのアクターからRPCを送信できます。RPCを送信するにはTargetFunction Nameが必要です。Function Nameは登録したものと同じです(上記を参照)。Targetは、RPCを受け取るアクターのオーナーやレプリカです。

Send Rpc

RPCを特定の1人のメンバーに送信します。メンバーはStrix Room Member構造体であり、これによってRPCの送信先のクライアントが決まります。この情報を取得する方法については、現在のルームのメンバー情報の取得を参照してください。

Send Rpc to All

ルーム内にいる、このメンバーを含む全てのメンバーにRPCを送信します。

Send Rpc to Object Owner

Targetに指定したアクターのオーナー(所有権を参照)にRPCを送信します。

Send Rpc to Other Members

ルーム内にいる、このメンバー以外の全てのメンバーにRPCを送信します。

Send Rpc to Room Owner

RPCを現在のルームオーナー(ルームオーナーを参照)に送信します。

RPCの引数

全てのRPC送信関数は、Strix Relay Arg構造体の配列を受け取ることができます。これらの構造体は、RPCが呼び出す関数の入力になる引数のラッパーです。

注釈

RPCを送信するときに、Strixはこの引数の配列が特定の関数シグネチャに対して有効であることを確認しません。正しい引数のシグネチャを用いるよう十分に注意してください。そうしないと、RPCの受信に失敗する可能性があります。

引数の配列は、指定された関数の引数を順番にリストとして表したものです。関数が引数を1つしか取らない場合でも、その引数を配列の中に入れなければなりません。

通常の値をStrix Relay Argsに変換するには、値からドラッグして、その値の型のためのToStrixRelayArgアダプターを使用します。変換ノードの結果出力はStrix Relay Arg型であり、ドラッグしてRPC関数の入力につなぐことができます(配列への変換は自動生成されます)。

Strixは、基本的なUnrealの型とコンテナーに対する多数の型変換をサポートしています。ブループリントアクションメニューにToStrixRelayArgと入力して利用可能な型を確認するか、シリアル化可能なRPCの引数を参照してください。

RPCコンテキスト

StrixにはStrix Rpc Contextという型が含まれています。これには次のメンバーがあります。

SenderMemberId

int

RPCの送信者のメンバーID

RoomId

int

このRPCが送信されたルームのID

誰が送信したかなど、RPCに関するコンテキスト情報を知りたい場合があります。

関数シグネチャに

func(..., FStrixRpcContext context, ...)

のようにコンテキスト引数が含まれている場合、Strixはその関数のRPC呼び出しにRPCコンテキストを自動的に挿入します。

注釈

RPCコンテキストは、関数へ渡すためのStrix Relay Argのリストには含めません。例えば、関数のシグネチャが (int32, FStrixRpcContext, bool) の場合、Send RPC関数はint32, bool を引数として受け取る必要があります。呼び出されると、Strixはコンテキストを関数に渡します。