週刊SleepNel新聞

SleepNel所属のぽうひろが日々の個人開発で気になったことを綴ります。

最終日 Unity Photon(PUN+) の使い方 変数同期編

f:id:pouhiroshi:20160610082505p:plain

昨日はPhotonのオブジェクト位置同期のやり方について解説しました。
sleepnel.hatenablog.com

今日は解説最後になりますが、Photonの変数同期のやり方について説明します。

前回は位置情報の同期を説明しました。
今回はそれ以外の変数情報の同期について説明します。

試合の残り時間など、位置情報以外の情報を同期したいことがあると思います。

ObservedComponentsにPhoton.MonoBehaviourを継承したScriptを指定して同期する。
こんな感じでObserver ComponentsにCubeScriptを追加します。
f:id:pouhiroshi:20160610080642p:plain

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します。

試しにやってみましょう。
f:id:pouhiroshi:20160610081125p:plain
このように自分が作ったオブジェクトの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側で変数の値を見てみます。
f:id:pouhiroshi:20160610081520p:plain
相手が作成したCubeのhensu1の値が変わりました!

変数2も変えてみます。
f:id:pouhiroshi:20160610081618p:plain

hensu2も変わりました!!

結果的にCubeScriptはvelocity情報をphotonTransformView.SetSynchronizedValuesで
変数情報をOnPhotonSerializeViewで同期することになりました。

DodgeWarsでは、この手法を使って試合残り時間を同期して、
片方だけ試合時間が遅れたりすることを防いでいます。


全5回にわたってPhotonの使い方を説明してきましたが、いかがだったでしょう。
ルーム、オブジェクト位置同期、変数同期の3つを使いこなせれば、
通信対戦で必要なものは概ねカバーできると思います。

ぜひ、チャレンジしてみてください!
(もしもう少し詳しく解説してほしい内容などあれば、ぜひコメントなどお寄せください。)

PUN+はこちらで購入できます!


それでは素敵なインディー開発ライフを!!