LoginSignup
6
7

More than 5 years have passed since last update.

PhotonUnityNetwork(PUN)のRPC通信を知る

Last updated at Posted at 2018-10-31

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

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7