さんたのお中元

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

Photon Unity Networking(PUN)の変数の値の同期(共有)

 PUNで変数の送受信をするときはOnPhotonSerializeViewメソッドを利用することになります。

int a;
string b;

void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) {
        if (stream.isWriting) {
            //データの送信
            stream.SendNext(a);
            stream.SendNext(b);
        } else {
            //データの受信
            a = (int)stream.ReceiveNext();
            b = (string)stream.ReceiveNext();
        }
}

これで変数a,bの値の送受信をルーム内のプレイヤーと行うことができますが、気を付けないといけないことがあります。

それはOnPhotonSerializeViewメソッドではマスタークライアントが更新処理を行っているということです。

この仕様によりマスタークライアント以外が変数を書き換える処理を行ってもすぐにマスタークライアントが保有している値に書き換えられてしまいます。

変数の書き換えがずっとうまくいかなかったためPhotonの公式サイトに問い合わせてみたところ、この仕様を教えていただきました。

解決するには、RPCでPhotonTargets.MasterClientを対象に変数の変更を送信するか、ルームのカスタムプロパティを利用することでルーム内に共有の変数を持たすとよいようです。

私は共有したい変数が多かったのでRPCでマスタークライアントに送信する方法を取りました。

他にもマスタークライアントとそれ以外のクライアントで異なる処理があると思うので、その可能性がある不具合があった場合はそこの確認をしてみると解決に向かえるかもしれません。