おもちゃラボ

Unityで遊びを作ってます

Unityでネットワーク通信をする6 (RPCで同期する)

最終回は、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()を呼び出しているため、呼び出し元のオブジェクトは黒色で塗りつぶしされますが、ネットワーク越しのオブジェクトはテクスチャ表示になったままだと思います。

f:id:nn_hokuson:20140607180146j:plain

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で関数を呼び出したとします。

f:id:nn_hokuson:20140607203047j:plain

RPCModeがAllの場合には、すべての端末で関数が呼び出されます。また、Othersの場合には自分以外のすべての端末で関数が呼び出されます。Serverの場合にはサーバの端末のみで関数が呼び出されます。

f:id:nn_hokuson:20140607203059j:plain

呼び出す関数にRPCのプレフィックスを付ける

こちらは更に簡単で、ToggleColor()の頭に[RPC]のプレフィックスがついただけですね。この[RPC]のプレフィックスをつけるだけで、関数をRPCに対応したものにできます。

さて、このwithRPC.csのプログラムをオブジェクトにアタッチして実験してみてください。画面上をクリックするたびに、呼び出し元だけでなく、呼び出し先のオブジェクトも「黒塗り」と「テクスチャ表示」を繰り返せば成功です。

f:id:nn_hokuson:20140607180159j:plain

参考図書

「ゲームの作り方 Unityで覚える遊びのアルゴリズム」

こちらはUnity中級編の参考書です。2Dから3Dのゲームまで、プロが作ったゲームのサンプルが10個もついています。サンプルプログラムといっても入門書に付いているような簡単なものではなく、ミニゲームとしてリリースしても良いレベルのものなので、読んでいて非常に勉強になります!