LoginSignup
2
3

More than 3 years have passed since last update.

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

Posted at

はじめに

こんにちは、のんびりエンジニアのたっつーです。
ブログを運営しています、今回はこの記事の転載になります。

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

Photon とは?

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

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

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

使い方

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

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

ソースコード

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

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

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

PhotonTextView.cs
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でサポートされている型 をみると基本的な部分は使えそうですね。

image.png

使い方

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

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

image-5.png

実行結果

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

photonsync.gif

終わりに

よければ ブログ「Unity+AssetStoreおすすめ情報」の方にも色々記載しているのでぜひご参照いただければと思います。

2
3
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3