はじめに
Unity使ってゲーム作るぞ~ オンラインゲーム作るぞ~
と意気込んで、さっと調べて目についたPhoton Unity Networking(PUN)でオンライン要素を実装することにしました。
まあ、さっと調べた時に色んなブログさんで参考資料見つけたし、正直余裕でしょ!とか思っていたら微妙なところで躓いたので備忘録として書いておきます。
PUNにはVer 1.~とVer 2.~がありまして、PUNのスタートアップを紹介しているところだとPUN2をダウンロードしましょう!ってあるんですが、実際にPUNでこういうのを実装しました!ってとこだとPUN1のほうってことが結構ありました。
そんでもってPUN1とPUN2でマイナーチェンジがちょこちょこあるもんだから、実際にコード書くと「そんなクラスはない!」だとか「そんなメソッドはない!」って怒られます。
タイトルのカスタムルームプロパティもその類のもので、実装までに時間がかかりました。
カスタムルームプロパティ
using UnityEngine;
using Photon.Pun;
public class RoomProperties : MonoBehaviourPunCallbacks
{
ExitGames.Client.Photon.Hashtable roomHash;
float time = 60.0f;
void Start()
{
//ルームプロパティ設定
roomHash = new ExitGames.Client.Photon.Hashtable();
roomHash.Add("Time", time);
PhotonNetwork.CurrentRoom.SetCustomProperties(roomHash);
}
void Update()
{
time -= Time.deltaTime;
roomHash["Time"] = time;
PhotonNetwork.CurrentRoom.SetCustomProperties(roomHash);
}
//ルームプロパティが変更されたときに呼ばれる
public override void OnRoomPropertiesUpdate(ExitGames.Client.Photon.Hashtable propertiesThatChanged)
{
object value = null;
//変更のあったプロパティに"Time"が含まれているならtimeを更新
if (propertiesThatChanged.TryGetValue("Time", out value))
{
time = (float)value;
}
}
}
とりあえず注意するところは、
PhotonNetwork.CurrentRoom.SetCustomProperties(roomHash)と
OnRoomPropertiesUpdate(ExitGames.Client.Photon.Hashtable propertiesThatChanged)です。
この2か所がPUN1から変更があるのでうっかりすると、エラーを吐き続けます。
あと、どれだけ値が更新されようがPhotonNetwork.CurrentRoom.SetCustomProperties(ExitGames.Client.Photon.Hashtable HashTable)を実行しないとそのルーム内では共有されません。
更新する値は一つだけということもなく、同時に複数の値を更新した後にSetCustomPropertiesを実行すると変更された値が全て更新されます。
更新するカスタムルームプロパティの値の種類だけ、OnRoomPropertiesUpdateにif文を書いておけばそれぞれが更新されます。
ちなみに、上記のように毎フレーム更新なんてことしたら通信量がガンガン増えるのでやめておいた方がいいです。
さいごに
困ったら公式リファレンスだ!
それでも無理なら現物のコードを追う!!