PUN2 ルーム同期

ルーム内の全てのクライアントが共通で使用できる値を同期させるためには
カスタムルームプロパティが使用される.C#でいうDictionary型,JavaでいうMap型.
ルーム内のステージオブジェクトやゲーム進行タイミングなどの同期に向いている.

// 送信
PhotonNetwork.CurrentRoom.SetCustomProperties(properties);

// 受信
public void OnRoomPropertiesUpdate(ExitGames.Client.Photon.Hashtable propertiesThatChanged);

ルームプロパティの同期は,PhotonViewと紐づいていないオブジェクトからも実行可能
但しルーム全体やゲーム進行に基づく共通変数を送信する場合は,マスタークライアントのみ
変更通知を行うようにするなどの管理者を限定する設計を考えたほうがいい.

サンプルコード 床の色を定期的に変更する

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using Photon.Pun;
using Photon.Realtime;

public class Floor : MonoBehaviourPunCallbacks
{
    // Joinイベントをリッスン
    public override void OnJoinedRoom()
    {
        // コルーチンで定期的に色を変更
        StartCoroutine("ChangeFloorColor");
    }

    IEnumerator ChangeFloorColor()
    {
        while (true)
        {
            // 自クライアントがマスタークライアントのみ
            if (PhotonNetwork.IsMasterClient)
            {
                // HashTable型であるカスタムプロパティを作成
                var properties = new ExitGames.Client.Photon.Hashtable();
                // 同期させたい共通変数をHashTableに追加する
                properties.Add("floorColor", new Vector3(Random.value, Random.value, Random.value));
                // このメソッドで送信する
                PhotonNetwork.CurrentRoom.SetCustomProperties(properties);
            }

            yield return new WaitForSeconds(3f);
        }
    }

    // このメソッドで受信する
    public override void OnRoomPropertiesUpdate(ExitGames.Client.Photon.Hashtable propertiesThatChanged)
    {
        object value = null;
        if (propertiesThatChanged.TryGetValue("floorColor", out value))
        {
            Vector3 color = (Vector3)value;
            this.GetComponent<Renderer>().material.color = new Color(color.x, color.y, color.z);
        }
    }

}

参考記事

github.com

www.urablog.xyz