最終回は、UnityのRPCについて説明したいと思います。RPCとはRemote Procedure Callの略で、ネットワーク越しにオブジェクの持つ関数を呼び出す仕組みのことです。ここ(Unityでネットワーク通信をする2(RPCについて) - おもちゃラボ)の記事にも書きましたが、オブジェクトにnetworkViewがアタッチされていても、関数はそのまま呼び出すことができません。まずは、そのことを実験してみましょう。
RPCなしで関数を呼び出す
networkViewをアタッチしたオブジェクトに下記のスクリプトもアタッチします。このスクリプトは画面上がタッチされた場合、「テクスチャ表示」と「黒色塗りつぶし」をトグルするものです。
RPCを使用しない関数呼び出し
woRPC.cs
void ToggleColor() { SpriteRenderer r = GetComponent<SpriteRenderer>(); r.color = ( r.color == Color.black ) ? Color.white : Color.black; } void Update () { if( networkView.isMine ) { if( Input.GetMouseButtonDown(0) ) { ToggleColor(); } } }
このスクリプトを実行した場合、通常の関数呼び出しの形式でToggleColor()を呼び出しているため、呼び出し元のオブジェクトは黒色で塗りつぶしされますが、ネットワーク越しのオブジェクトはテクスチャ表示になったままだと思います。
RPCで関数を呼び出す
さて、RPCを使わないと、ネットワーク越しに関数を呼び出すことができないことがわかりました。ここからはRPCを利用して、ネットワーク越しに関数の呼び出す方法を説明します。RPC(Remote Procedure Call)と仰々しい名前は付いているものの、Unityでは簡単に扱うことができます。
RPCの仕組みを利用するのに必要なのは以下の2点です。
1. 関数呼び出しをRPCに対応したものにする
2. 呼び出す関数にRPCのプレフィックスを付ける
以下では具体的にプログラムを見ながら説明していきます。
RPCを利用した関数呼び出し
withRPC.cs
[RPC] void ToggleColor() { SpriteRenderer r = GetComponent<SpriteRenderer>(); r.color = ( r.color == Color.black ) ? Color.white : Color.black; } void Update () { if( networkView.isMine ) { if( Input.GetMouseButtonDown(0) ) { networkView.RPC("ToggleColor", RPCMode.All); } }
関数呼び出しをRPCに対応したものにする
RPCを利用した場合には、関数の呼び出しの際、ToggleColor()ではなくnetworkView.RPC("ToggleColor", RPCMode.All)になっています。networkViewのRPC()に呼び出したいRPCの関数名を記述するだけでRPCの呼び出しが可能になります。
また、第二引数には関数呼び出しの影響範囲を指定します。RPCModeにはAll, Others, Serverがあります。例えば、下図のようなトポロジにおいて一台のクライアント端末がRPCで関数を呼び出したとします。
RPCModeがAllの場合には、すべての端末で関数が呼び出されます。また、Othersの場合には自分以外のすべての端末で関数が呼び出されます。Serverの場合にはサーバの端末のみで関数が呼び出されます。
呼び出す関数にRPCのプレフィックスを付ける
こちらは更に簡単で、ToggleColor()の頭に[RPC]のプレフィックスがついただけですね。この[RPC]のプレフィックスをつけるだけで、関数をRPCに対応したものにできます。
さて、このwithRPC.csのプログラムをオブジェクトにアタッチして実験してみてください。画面上をクリックするたびに、呼び出し元だけでなく、呼び出し先のオブジェクトも「黒塗り」と「テクスチャ表示」を繰り返せば成功です。
まとめ
6回にわたってUnityのネットワーク通信に関して説明してきました。UnityのRPCに関するリファレンスには、ここに書ききれなかった、ゲームでの応用例なども解説されているので、合わせて参照するとより理解が深まると思います。
Unityでネットワーク通信をする(networkViewについて) - おもちゃラボ
Unityでネットワーク通信をする2(RPCについて) - おもちゃラボ
Unityでネットワーク通信をする3 (インスタンス生成) - おもちゃラボ
Unityでネットワーク通信をする4 (C#でプログラミング) - おもちゃラボ
Unityでネットワーク通信をする5 (動作を同期する) - おもちゃラボ
参考図書
「ゲームの作り方 Unityで覚える遊びのアルゴリズム」
こちらはUnity中級編の参考書です。2Dから3Dのゲームまで、プロが作ったゲームのサンプルが10個もついています。サンプルプログラムといっても入門書に付いているような簡単なものではなく、ミニゲームとしてリリースしても良いレベルのものなので、読んでいて非常に勉強になります!