さんたのお中元

Unityでのゲーム開発について主に書いていきます

Photon Unity Networking(PUN)を使っていて詰まったところ

今ウェブブラウザで遊べる対戦ゲームを作っているのですが、それにあたってUnityとそのプラグインPhoton Unity Networking(PUN)を使わせていただいています。

非常に便利ですがなにぶんプログラミングの腕がまだまだなので各プレイヤーの画面を同期させるときに結構詰まっています。
そういったところをメモがてら書いておきます。
(※間違いやよりよい方法があると思います)

  • RPCの引数

画面上のオブジェクトをクリックしたときに関数を実行し、それをRPCを使って同期させたいときに気を付けないといけないのがRPCの引数にobject型の変数が使用できないことです。

RPCの引数にobject型の変数を使用してそれを呼び出すと、
rpc error Exception: cannot serialize() のエラーが出ることになります。

使用できる引数はこちら(Unity - マニュアル: RPC の詳細)にあります。

int型の変数を引数にしてその値でオブジェクトを識別するようにしたりするといいかもしれません。

  • コルーチンの同期

iTweenのアニメーションを使いたいときコルーチンを使うことになりますがそれを同期させるとき以下のようにするとうまくいきました。

GameObject obj;
Vector3 posi = new Vector3 (5.0f, 5.0f, 0.0f);

//中略

//1秒で指定した位置にアニメーションする
IEnumerator MoveTest(
 iTween.MoveTo (obj, iTween.Hash ("x", posi.x, "y", posi.y, "z", posi.z, "islocal", true, "time", 1.0f));
 yield return new WaitForSeconds (1.0f);
}

//この関数をphotonView.RPCで呼び出すとアニメーションが同期する
[RPC]
void RPCTest(){
 StartCoroutine(MoveTest());
}

アニメーションの処理を呼ぶStartCoroutine()を関数に埋め込み、それをさらにRPCで呼び出すことで同期できました。

  • Buttonと同期

UnityのuGUI機能Buttonはインスペクター上のOn Click()にクリック時に実行したい関数を設定することができます。

一方、PUNで関数を同期させたい場合はPhotonViewのRPCを使うことになります。

同期させたい関数をそのまま設定すると同期させることができませんでした。

そこで実行したい処理にRPCを使い、実際に設定する関数で呼び出すことでうまく同期させることができました。

//Buttonのインスペクター上に設定する関数
void ButtonTest(){
 photonView.RPC("RPCTest", PhotonTargets.All);
}

//同期させたい処理
[RPC]
void RPCTest(){
 Debug.Log("test");
}

また何かあったら書いていきます。