昨日はPhotonのオブジェクト位置同期のやり方について解説しました。
sleepnel.hatenablog.com
今日は解説最後になりますが、Photonの変数同期のやり方について説明します。
前回は位置情報の同期を説明しました。
今回はそれ以外の変数情報の同期について説明します。
試合の残り時間など、位置情報以外の情報を同期したいことがあると思います。
ObservedComponentsにPhoton.MonoBehaviourを継承したScriptを指定して同期する。
こんな感じでObserver ComponentsにCubeScriptを追加します。
CubeScriptには以下のように変数を定義します
//同期する変数1 public int hensu1 = 0; public float hensu2 = 0f;
変数同期はOnPhotonSerializeViewメソッドを定義して行います。
void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) { if (stream.isWriting) { //データの送信 stream.SendNext(hensu1); stream.SendNext(hensu2); } else { //データの受信 this.hensu1 = (int)stream.ReceiveNext(); this.hensu2 = (int)stream.ReceiveNext(); } }
変数同期は、void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
というメソッドでやり取りをします。
この中で送信時(isWriting)と受信時(!isWriting)の振る舞いを書きます。
複数の変数のやり取りも可能で、stream.SendNextとReceiveNextを変数の順番通りにやり取りします。
上の例ですとhensu1とhensu2を順番に送っていますので、受信時もhensu1、hensu2の順番でReceiveNextします。
試しにやってみましょう。
このように自分が作ったオブジェクトのCubeScriptの変数1,2の値を変えるボタンを用意しました。
スクリプトは以下のようになっています。
//作成したCubeの変数1を変更する public void ChangeVal(){ cube.GetComponent<CubeScript> ().hensu1 = 10; } //作成したCubeの変数2を変更する public void ChangeVal2(){ cube.GetComponent<CubeScript> ().hensu2 = 5f; }
端末側で変数1を変更するボタンを押しました。
UnityEditor側で変数の値を見てみます。
相手が作成したCubeのhensu1の値が変わりました!
変数2も変えてみます。
hensu2も変わりました!!
結果的にCubeScriptはvelocity情報をphotonTransformView.SetSynchronizedValuesで
変数情報をOnPhotonSerializeViewで同期することになりました。
DodgeWarsでは、この手法を使って試合残り時間を同期して、
片方だけ試合時間が遅れたりすることを防いでいます。
全5回にわたってPhotonの使い方を説明してきましたが、いかがだったでしょう。
ルーム、オブジェクト位置同期、変数同期の3つを使いこなせれば、
通信対戦で必要なものは概ねカバーできると思います。
ぜひ、チャレンジしてみてください!
(もしもう少し詳しく解説してほしい内容などあれば、ぜひコメントなどお寄せください。)
PUN+はこちらで購入できます!
それでは素敵なインディー開発ライフを!!