Skip to content

202 4 共通変数の同期方法

miuccie miurror edited this page Jan 17, 2020 · 13 revisions

202-4 - 共通変数の同期方法


ルーム同期 - カスタムルームプロパティ

ルーム内の全クライアントが共通で使用するような値を同期させるには、カスタムルームプロパティが使用できます。 これはルーム内のステージオブジェクトやゲーム進行タイミングなどを同期させるのに向いています。

ルームプロパティによる同期を行うには、以下のメソッドを使用します。


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

// 受信 (IInRoomCallbacks経由で実装する)
public void OnRoomPropertiesUpdate(ExitGames.Client.Photon.Hashtable propertiesThatChanged );

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

注意:PUN1のOnPhotonCustomRoomPropertiesChanged()ハンドラは、PUN2では、IInRoomCallbacks.OnRoomPropertiesUpdate()へ変更されました。

ルームの色の同期

ここではルームの床の色を一定間隔でランダムに変更し、その変更をルームプロパティを使って同期してみます。
下記の内容で作成したFloor.csというスクリプトを作成し、それをFloorオブジェクトへアタッチしてください。

using UnityEngine;
using System.Collections;

using Photon.Pun;
using Photon.Realtime;

namespace VRStudies { namespace SinglePlayer {

public class Floor : MonoBehaviourPunCallbacks {

	// Joinイベントをリッスン
	//------------------------------------------------------------------------------------------------------------------------------//
	public override void OnJoinedRoom() {

		// 定期的に床の色を変更する
		StartCoroutine( "ChangeFloorColor" );
	}

	//------------------------------------------------------------------------------------------------------------------------------//
	// ルームプロパティによる共通変数の同期
	//------------------------------------------------------------------------------------------------------------------------------//
	IEnumerator ChangeFloorColor() {

		while(true){
				
			//定期的に部屋の色を変更する

			// 自クライアントがマスタークライアントの場合のみ
			if( PhotonNetwork.IsMasterClient ) {

				// ルームプロパティで送信
				var properties  = new ExitGames.Client.Photon.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 changedProperties ){

		// ルームプロパティから床の色を取得
		object value = null;
		if (changedProperties.TryGetValue ("floorColor", out value)) {
			Vector3 color = (Vector3)value;
			this.GetComponent<Renderer> ().material.color = new Color( color.x, color.y, color.z );
		}
	}
}
}}

この際、MonoBehaviourPunCallbacksを親クラスにして、ルームにログインした後にマスタークライアントのみがルームプロパティを変更していることに注意してください。


共通変数の同期の確認

2つのクライアントを起動して実行してみてください。一定間隔で変更される床の色が全てのクライアントで同期されているでしょうか。

またマスタークライアントが切断した後でも、別のクライアントがマスタークライアントとなることで、床の色の同期が続くことを確認してみてください。


講義で実装したマルチプレーヤー対応は下記シーンにまとめて収められています
https://github.com/yumemi-inc/vr-studies/tree/master/vol2/VR-studies/Assets/VR-studies/1_MultiPlayer/MultiPlayer.unity