PhotonのCustomPropertyを使う

前提:

  • Unity-Ver-2019.3.9f
  • Pun-Ver-2.17

PhotonにはCustomPropertyという便利なものがあります。

ルームかプレイヤーに設定できるHash値です。値を変更したらコールバックも呼ばれます。

ちょっと迷ったんでMEMOっておきます。

といっても使い方は簡単で、

using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using ExitGames.Client.Photon;
public class DebugCustomProp : MonoBehaviourPunCallbacks
{
    [SerializeField]
    string testkey, testvalue;
    private void Start()
    {
        SetCustomProp();
    }
    public void SetCustomProp()
    {
        //ルームのプロパティを取得
        //System.collection.Hashtableではない
        Hashtable prop = PhotonNetwork.CurrentRoom.CustomProperties;
        object temp = null;
        //キーを持っているか確認した方がよさそう
        if (prop.TryGetValue(testkey,out temp))
        {
            prop[testkey] = testvalue;
        }
        else
        {
            prop.Add(testkey, testvalue);
        }
        //更新したプロパティをセットする
        PhotonNetwork.CurrentRoom.SetCustomProperties(prop);
    }

    public override void OnRoomPropertiesUpdate(ExitGames.Client.Photon.Hashtable propertiesThatChanged)
    {
        Debug.Log(SupportClass.DictionaryToString(propertiesThatChanged));
    }
}

現在のHash値を取得して値を追加するだけです。

RoomかPlayerに応じて対応するコールバックが呼ばれます。


最初は,New HashTable()で新しくHashインスタンスを生成して、それをセットしてたらちゃんと動きませんでした。

これだけでえらく時間取られた……。

  • System.Collections.HashtableじゃなくてExitGames.Client.Photon.Hashtableを使う
  • Hash値は直接生成せずにRoom.CustomPropertiesから取得して、欲しい値を追加して、またSetCustomPropertiesでセットしなおす
  • 値を読み書きする前にtrygetvalue()を使った方が良いかも
  • なんか知んないけどコールバックが複数回呼ばれることがあって、プロパティがちゃんと入ってない時がある。Editorだけかも。使うときはKeyをもっているか確認した方が良いかも。

これだけ気を付ければ普通に使えそうです。

セットできる型は文字列だけなので、数字とかはParseして入力取得する必要があります。

コメント

  1. うどん より:

    初めまして。自分もPUN2を使っていて、オンラインボードゲームを開発しています。
    ゲーム内の値を同期させたくてこの記事を参考にさせて頂き、実装しました。
    記事に書かれているようにOnRoomPropertiesUpdateのコールバックが複数回呼ばれてしまっているような挙動をしてうまく動いてくれません。
    コールバックが複数回呼ばれてしまう条件とかって何かご存じだったりしませんでしょうか?

  2. 匿名 より:

    げんとめさん
    返信ありがとうございます。大変参考になる情報をありがとうございます!

    今まで値をOnRoomPropertiesUpdateでカスタムプロパティの変更を受信する時にはTryGetValueを使ってkeyの有無を判定していたのですが、セットする時も確認のコードを挟んだ方が良さそうですね。

    セットする前にkeyを持っているとは思うのですが、何か見落としがあったのかもしれません。試してみます!ありがとうございました!

  3. うどん より:

    げんとめさん
    返信ありがとうございます。大変参考になる情報をありがとうございます!

    今まで値をOnRoomPropertiesUpdateでカスタムプロパティの変更を受信する時にはTryGetValueを使ってkeyの有無を判定していたのですが、セットする時も確認のコードを挟んだ方が良さそうですね。

    セットする前にkeyを持っているとは思うのですが、何か見落としがあったのかもしれません。試してみます!ありがとうございました!

タイトルとURLをコピーしました