Remote Procedure Calls (RPC)はリモートマシンの関数呼び出しを可能にします。RPC実行は通常の関数の呼び出しと似て簡単ですが,理解すべき重要な違いがいくつかあります。
RPCの引数の数は任に決められますが,使用するネットワーク帯域幅が引数の数と大きさにより増えます。最大のパフォーマンスを得る単に引数の数は最小に抑えるべきです。
通常の関数呼び出しと異なってRPCはリクエストの受け手を示す引数を指定します。一通り全てのケースをカバーするためいくつかRPC呼び出しモードが用意されてます。例えばRPCをすべての接続マシンで実行,サーバー単独で実行,コール送信元・あるいは任意のクライアントのみ実行しないなど指定できます。
RPC呼び出しは通常あるイベントをクライアント全てに送信するか二つのグループ間でイベント情報を渡しますが,工夫して好きなように活用できます。例えば4クライアント接続されたサーバーは4つめのクライアントが接続して初めてイベントを送信してゲーム開始出来ます。クライアントがアイテムを拾った時にクライアント全てにそのことをRPC呼び出しをして知らせることが出来ます。サーバーは特定RPCを特定クライアントのみに接続直後に送信し,プレイヤー番号,生成位置,チームカラーなどを渡せます。クライアントはそれと引き換えにスタート時のオプションを提示し,希望のカラーや購入したアイテムなどをサーバーだけにRPCを呼び出して送信できます。
リモート実行する前に関数はRPCとしてマーキングする必要があります。このため関数の前にRPC属性を示す記号を入れます。
// All RPC calls need the @RPC attribute!
@RPC
function PrintText (text : String)
{
Debug.Log(text);
}
全てのネットワーク通信はNetworkViewコンポーネントで行うためRPC関数を宣言したスクリプトに呼び出し前にアタッチする必要があります。
次の変数タイプをRPCの引数として使用出来ます:
例えば,次のコードによりひとのstring引数を持つRPCを実行します:
networkView.RPC ("PrintText", RPCMode.All, "Hello world");
RPC()の最初の引数は実行する関数の名前で,2つめの引数は実行ターゲット対象を指定します。この場合,サーバ接続しているクライアント全てで実行します。(後ほど接続されるクライアント向けを待ってコールがバッファリングされることはありません,このバッファリングの詳細は以下を参照下さい)
2つ目の引数より後は,RPC関数に送信され,ネットワーク上を経由します。この場合では“Hello World”は引数としてPrintText関数のテキスト引数として渡されます。
さらに追加の内部引数として,RPCの呼び出し元など追加の情報を保持できるNetworkMessageInfo 構造体を参照できるようになります。この情報は自動的に送信されるため,PrintText関数は次のように宣言されます:
@RPC
function PrintText (text : String, info : NetworkMessageInfo)
{
Debug.Log(text + " from " + info.sender);
}
この際,関数実行の記述は変更の必要がありません。
上で述べたようにNetwork ViewをRPC関数を含むスクリプトを含むゲームオブジェクトにアタッチする必要があります。もしRPCを独立させて使用する場合(すなわち,状態同期なし),Network ViewのState SynchronizationをOffにします。
RPC関数の呼び出しはバッファリングできます。バッファリングされたRPC関数の呼び出しは蓄積されたうえ,発行された順序で接続するクライアントごとに並べられます。これにより,遅れてきたプレイヤーがスタート時点から必要な情報が得られることを保証します。良くあるシナリオとしては,接続するプレイヤーが戸kつ英のレベルをロードするというシナリオです。このレベルの詳細を全ての接続されたプレーヤーに送信し,将来的に後から接続するプレイヤーのためにバッファリングします。これにより,新しいプレイヤーがあたかもスタートの最初から存在したかのごとくレベル情報を受信できます。
RPCバッファから必要に応じて呼び出しを除くことが出来ます。上の例で続けると,新しいプレイヤーが加わる前にゲームが次のレベルに進んでいる場合があり,この場合は元のバッファリングされたRPCを除いて,新しいレベルを要求するリクエストを送信することが出来ます。