PUN2 ストリーム同期

オブジェクトの位置や回転の同期はPhotonViewObserved
PhotonTransformViewをアタッチすることで行うことができた.

他のデータを同期させたい場合は下記のように複数の方法がある.

  • ストリーム同期
  • イベント同期
  • ルーム同期

今日はストリーム同期.

ストリーム同期 OnPhotonSerializeView()

PhotonViewに監視対象のクラスを指定することで,ストリームによる同期処理が可能.
連続的な値やオブジェクトの状態変数を同期するのに向いている.

ストリームによる同期を行うためにはIPunObservableインタフェースで
定義されている以下のCallbackを利用する.
public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
このCallbackで通信できるデータ型は
bool char short int float Quaternion Vector3 NetworkPlayer NetworkViewID

このメソッドが呼ばれるためにはPhotonViewObserved
このハンドラを実装したスクリプトを追加する.

スクリプトのパターンとしてはこんな感じになるのかな.

    public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) {

        if ( stream.IsWriting ) {

            // 自クライアント所有のオブジェクトの状態変更を送信
            T myValiable = this.gameObject~;
            stream.SendNext( myValiable );

        } else {

            // 他クライアント所有のオブジェクトの状態変更を受信
            T otherValiable = (T) stream.ReceiveNext();

            // 名前の変更を反映する
            this.gameObject.~ = otherValiable;
            transform.Find ("NameUI").gameObject.GetComponent<TextMesh>().text = otherName
        }
    }

参考記事

202 2 連続的な値の同期方法 · yumemi-inc/vr-studies Wiki · GitHub