Photon(PUN 2)で任意データの同期処理を書く(自動でオーナー変更!)

最終更新日

はじめに

たっつー(管理人)
たっつー(管理人)

こんにちは、のんびりエンジニアのたっつーです。
Twitter(@kingyo222)で Unity情報 を発信しているのでよければフォローしてください!

 

Unityのネットワークライブラリの Photon を使う場合に、自分で定義したデータを同期したい場合がありますよね。
そこで今回は自分で同期処理を書いてみます。

Photon とは?

PUN 2 – FREE (無料版)
Photon PUN 2+ (有料 版 )

Photon とはマルチプレイヤーゲームを作る場合にネットワーク部分を担当してくれるネットワークライブラリになります。

例えば、モンストなどのゲームを作る場合には同時プレイしている4人の画面の情報を同期しないといけないですよね?そんな時に Photon を使うとネットワーク部分のめんどくさい部分を一括して担当してくれます。

使い方

まずは、Photon は同期するオブジェクトに PhotonView のスクリプトをアタッチします。
この PhotonView ではそのオブジェクトがどのクライアントの持ち主(オーナー)かを管理しています。

データを同期する際には、オーナー側がデータを送信して、オーナー以外がデータを受信する動きをします。
オーナー以外がデータを送信する側になりたい場合、一度オーナー権限を取得してからデータを送信する処理を書きましょう。

ソースコード

今回はサンプルとして、文字列(テキスト)を同期するスクリプトを書いてみます。

1つ目ポイントとなるのは、OnPhotonSerializeView メソッドでオーナー側、オーナー以外側の処理を同時に記載しています。

2つ目のポイントは、Textプロパティを変更すると、オーナーのリクエストを発行して非オーナーでもデータの変更(同期)が可能となっています。
Text変更毎にオーナーがどんどん変わっていきます

using Photon.Pun;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PhotonTextView : MonoBehaviour, IPunObservable
{
    private PhotonView photonView;

    public string _text;

    public string Text
    {
        get { return _text; }
        set { _text = value; RequestOwner(); }
    }

    void Awake()
    {
        this.photonView = GetComponent<PhotonView>();
    }

    public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
        // オーナーの場合
        if (stream.IsWriting)
        {
            stream.SendNext(this._text);
        }
        // オーナー以外の場合
        else
        {
            this._text = (string)stream.ReceiveNext();
        }
    }

    private void RequestOwner()
    {
        if (this.photonView.IsMine == false)
        {
            if (this.photonView.OwnershipTransfer != OwnershipOption.Request)
                Debug.LogError("OwnershipTransferをRequestに変更してください。");
            else
                this.photonView.RequestOwnership();
        }
    }
}

同期可能なデータ種類

Photonでサポートされている型 をみると基本的な部分は使えそうですね。

Type (C#) Size [bytes] Description
byte
2
8 bit unsigned
boolean
2
true or false
short
3
16 bit
int
5
32 bit
long
9
64 bit
float
5
32 bit
double
9
64 bit
string
3 + size( UTF8.GetBytes(string) )
< short.MaxValue length
byte-array
5 + 1 * length
< int.MaxValue length
int-array
5 + 4 * length
< int.MaxValue length
array of <type>
4 + size(entries) – count(entries)
< short.MaxValue length
hashtable
3 + size(keys) + size(values)
< short.MaxValue pairs
dictionary
3 + size(keys) + size(values)
< short.MaxValue pairs
additional size if K- or V-type is object

使い方

使い方は、下の3ステップになります。
※ すでに PhotonView が追加されている場合は、Observed Componetnsのプラスボタンで複数追加できるようになるので増やして使ってください。

1.PhotonView を追加してください。
2.PhotonTextView (今回作成したスクリプト) を追加してください。
3.PhotonTextView を PhotonView.ObservedComponets に紐づけてください。
4.PhotonViewの Owner=Request に変更してください。

実行結果

それでは実行してみましょう、以下のようなクライアントになります。
 左側が、オーナー側で送信側
 右側が、非オーナー側で受信側

おすすめの記事







よければ、SNSにシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

コメントする