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 に変更してください。
実行結果
それでは実行してみましょう、以下のようなクライアントになります。
左側が、オーナー側で送信側
右側が、非オーナー側で受信側
おすすめの記事
- Unity受賞一覧
- 人気のアセット一覧
- Unityでおすすめアセット集(2019/11更新)
- Unity:初心者におすすめの無料アセット12選
- Unityのおすすめアセット 5選(カメラ編)
- Unityのおすすめアセット 4選(アニメーション編)
- Unityのおすすめアセット 4選(データ編)
- Unityのおすすめアセット 4選(AI編)
- Unityのおすすめアセット 3選(ポストエフェクト編)
- Unityのおすすめアセット 7選(AR・VR・MR編)
- Unityのおすすめアセット 5選(ネットワーク編)
- Unityのおすすめアセット 5選(シェーダー編)
- Unityのおすすめアセット 6選(レンダリング編)
- Unityのおすすめアセット 7選(UI・GUI編)
- Unityのおすすめアセット 4選(スクリプティング)
- Unityのおすすめアセット 5選(モバイルネイティブ機能)
- Unityのおすすめアセット 7選(モデリング)
- Unityのおすすめアセット 50選 ゲームジャム(GameJam) ハッカソン(Hackathon)
- 人気のモデル(キャラクター)
よければ、SNSにシェアをお願いします!