202 4 共通変数の同期方法

miuccie miurror edited this page Jan 6, 2018 · 4 revisions

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


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

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

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


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

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

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

ルームの色の同期

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

using UnityEngine;
using System.Collections;

namespace VRStudies {

public class Floor : Photon.MonoBehaviour {

	// Joinイベントをリッスン
	//------------------------------------------------------------------------------------------------------------------------------//
	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.room.SetCustomProperties( properties );
			}

			yield return new WaitForSeconds( 3f );
		}
	}

	public void OnPhotonCustomRoomPropertiesChanged( 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 );
		}
	}
}
}

共通変数の同期の確認

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

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


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

You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.