PhotonUnityNetwork(PUN)のRPC通信を知る
最近Photonを使うようになったのですが、良く使われる通信方式「RPC通信」ってどういう通信なのか、よくわかってなかったので調べてみました。
RPC?
Remote Procedure Call (直訳で遠隔手順呼び出し)の略。
要は、Photonの通信イベントから指定関数を呼び出すことができるとのこと。
でもそれってイベントを通信するのとどう違うのか、考えてみました。
RPCの特性
PUNでのRPC通信は、必ずPhotonView
を介して行う必要があります。
つまり、シーン内にPhotonView
がアタッチされたゲームオブジェクトがなければ、RPC通信はできません。
そして、RPC通信で呼び出す関数は、呼び出すPhotonViewと同じゲームオブジェクトにアタッチされた[PunRPC]
属性が付いた関数になります。
photonView.RPC("Hoge", RpcTarget.All);
[PunRPC]
public void Hoge() {
//Fuga
}
このように、呼び出したい関数名をstring型で指定します。
なお、string型で指定する関係上、同じ名前の関数を別クラスでそれぞれ[PunRPC]
属性を付けて指定することは可能ですが、実行時にエラーが出ます。
RPC通信に向いているイベント
ユーザーごとに別の値になり、その値を他のユーザーに通知する必要があるものなどはRPC通信に向いていると思います。
たとえば、対戦ゲームでユーザーごとのHPに変動があるとき、RPC通信でDamage(int damage)関数を呼んでHPの変動を共有したりできます。
でも公式ドキュメントを見ると、RPC通信は即座に共有するわけではないので、ほどほどの頻度の通信に使うように、とのことです。ターン制バトルとかには向いてそうですね。
RPCを使わないイベント
「ゲーム開始」など、全体に関係するイベントは、RPC通信である必要がないと思います(RPCで通信しても別にいいです)
ルーム内全員が同じ反応をする場合は、別に必要なさそうですね。
また、ユーザーの現在位置など、とても頻繁に変更がある通信はObject Synchronization
という別の通信が推奨されるようです。
余談:PUN2を使ってみた
今まで、PUN無印を使ってたのですが、せっかくなので今回PUN2を入れてみました。
予想外に普通にルームに入れるようになるまでに苦労しました。
PUN無印と違ったので注意する点
- AutoLobbyLoginが無くなりましたが、OnJoinedLobbyが呼ばれなくてもルームを生成・参加できるようです
- OnJoinedLobbyの代わりに、OnConnectedToMasterが呼ばれた時点でロビーに入ったのと同じ処理ができます
- 各種イベント通知を受け取るには、対応したインターフェースを継承している必要があります
- ついでに、コールバックターゲットに前もって指定しておく必要もあります
- 全部の必要関数を書くのがとても面倒なので、
MonoBehaviourPunCallbacks
を継承すると一発で必要関数をすべて定義したことになります。あとは適宜必要部分だけoverrideでOK
参考
公式ドキュメント:https://doc.photonengine.com/ja-jp/pun/v1/gameplay/synchronization-and-state