前提:
- 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して入力取得する必要があります。
コメント
初めまして。自分もPUN2を使っていて、オンラインボードゲームを開発しています。
ゲーム内の値を同期させたくてこの記事を参考にさせて頂き、実装しました。
記事に書かれているようにOnRoomPropertiesUpdateのコールバックが複数回呼ばれてしまっているような挙動をしてうまく動いてくれません。
コールバックが複数回呼ばれてしまう条件とかって何かご存じだったりしませんでしょうか?
私もちょっと色々試してみたんですが、はっきりしませんでした。
下の記事にあったんですが、値をセットする前に
props.Trygetvalue()
を使って、値を持っているか確認したうえでセットしたら、自分の環境では上手くいくようになってしまったもので、それ以上はまってないんです。
https://stackoverflow.com/questions/56978277/question-about-photonnetwork-currentroom-customproperties
直接の関係はないと思うので原因は不明のままです。
お力になれず申し訳ないです。
げんとめさん
返信ありがとうございます。大変参考になる情報をありがとうございます!
今まで値をOnRoomPropertiesUpdateでカスタムプロパティの変更を受信する時にはTryGetValueを使ってkeyの有無を判定していたのですが、セットする時も確認のコードを挟んだ方が良さそうですね。
セットする前にkeyを持っているとは思うのですが、何か見落としがあったのかもしれません。試してみます!ありがとうございました!
げんとめさん
返信ありがとうございます。大変参考になる情報をありがとうございます!
今まで値をOnRoomPropertiesUpdateでカスタムプロパティの変更を受信する時にはTryGetValueを使ってkeyの有無を判定していたのですが、セットする時も確認のコードを挟んだ方が良さそうですね。
セットする前にkeyを持っているとは思うのですが、何か見落としがあったのかもしれません。試してみます!ありがとうございました!