UnityでPhotonネットワークその2

Unityで作成中のイベント用アプリの作成メモです

現在作成中のアプリですが,同期などの関係から(たぶん)全員が同じ部屋に入ることが必要です.

そこでいろいろ面倒が発生します(以下,photonのレベル別マッチメイクのスクリプトなどから流用しています)

(1)photonネットワーク接続直後にはroom listを取得してもゼロが返るっぽい.不確実だけど対抗策は

	void OnReceivedRoomListUpdate()

で,リストがアップデートされてから,ルームリストをチェックする.

(2) PhotonNetwork.CreateRoom()はどうもエラーが起きやすい.ので,確実にその名前のルームが無いことを確認しなくてはいけない(そこで上記のルームリストを使うけど,タイミングが,,,

(3)そこでおおまかな流れとしては,Photonに接続して,ロビーに入ったら,そのままにしておいてリストのアップデートを待つ.アップデートされない時のために,5秒くらい待つ関数を入れるか思案中(未実装).リストがアップデートされたら,同名のルーム名がないかチェックして,あればそこに入室,なければ作成をする.

ここまでのスクリプトです.

using UnityEngine;
using System.Collections;
using Hashtable = ExitGames.Client.Photon.Hashtable; //need for generate hashtable

public class photonsystem : Photon.MonoBehaviour {
	public string objectName;
	private bool connectFailed = false;

	//set player name
	private string playerName = "GuestAAA";	
	//set room name
	private string roomName = "liub2";//liubという専用のルーム名を作成



	void OnJoinedLobby() {
			Debug.Log("ロビーに入室");
			//ランダムにルームへ参加

		//thi wrok
		//PhotonNetwork.JoinRandomRoom();// join to random room tempolary
		//until here//

		}



	void OnReceivedRoomListUpdate()
	{
		CreateRoom ();
	}


	/////test 24th January

	public void CreateRoom (){
		RoomOptions roomOptions = new RoomOptions ();
		roomOptions.isVisible = true;
		roomOptions.isOpen = true;
		roomOptions.maxPlayers = 50;//test 50 max players
		roomOptions.customRoomProperties = new ExitGames.Client.Photon.Hashtable (){{"CustomProperties", "111"},{"r", "0.2"}};
		roomOptions.customRoomPropertiesForLobby = new string[] {"CustomProperties"};

		if (PhotonNetwork.GetRoomList ().Length == 0) {
			PhotonNetwork.CreateRoom (roomName, roomOptions, null);
			return;
		}
		foreach (RoomInfo roomInfo in PhotonNetwork.GetRoomList()) {
			if (roomInfo.name != roomName) {
				PhotonNetwork.CreateRoom (roomName, roomOptions, null);
			} else {
				//isRoomEnabled = true;
				PhotonNetwork.JoinRoom(roomName);
			}
		}
	}






		/// 部屋に入るとき呼ばれます。
		/// これは参加する際だけでなく作成する際も含みます。
		void OnJoinedRoom() {
		Debug.Log("部屋に入室" + PhotonNetwork.room.name);

		//ゲームオブジェクト作成する時用
		//GameObject cube = PhotonNetwork.Instantiate(objectName, Vector3.zero, Quaternion.identity, 0);

		//make cube
		//GameObject player = PhotonNetwork.Instantiate("testobj", this.transform.position, this.transform.rotation, 0);
		}

		/// JoinRandom()の入室が失敗した場合に後に呼び出されます。
		void OnPhotonRandomJoinFailed() {
		//void OnPhotonJoinFailed() {
			Debug.Log("部屋入室失敗");
			//名前のないルームを作成
		//	PhotonNetwork.CreateRoom(null);

		/////以下はテスト用えコメントアウトしています 
		//create custom property
	//	RoomOptions myOptions = new RoomOptions ();// require use custom property
	//	myOptions.isVisible = true;
	//	myOptions.isOpen = true;
	//	myOptions.maxPlayers = 50;
	//	myOptions.customRoomProperties = new ExitGames.Client.Photon.Hashtable (){{"CustomProperties", "111"},{"r", "0.2"}};
	//	myOptions.customRoomPropertiesForLobby = new string[] {"CustomProperties"};

		// ルームの作成
	//	PhotonNetwork.JoinOrCreateRoom(roomName, myOptions, null);


		}


		void Awake() {
			//マスターサーバーへ接続
			PhotonNetwork.ConnectUsingSettings("v0.1");


		if (PhotonNetwork.playerName==null)
		{
			//ランダムにプレイヤーの名前を生成
			this.playerName = "Guest" + UnityEngine.Random.Range(1, 9999);
			//Photonにプレイヤーを登録
			PhotonNetwork.playerName = this.playerName; 
		}else{
			//Photonにプレイヤーを登録
			this.playerName = PhotonNetwork.playerName;
		}

		}


	//部屋作成に成功したときにコール
	public void OnCreatedRoom(){
		Debug.Log("OnCreatedRoom");
	}
	//接続が切断されたときにコール
	public void OnDisconnectedFromPhoton(){
		Debug.Log("Disconnected from Photon.");
	}
	//接続失敗時にコール
	public void OnFailedToConnectToPhoton(object parameters){
		this.connectFailed = true;
		Debug.Log("OnFailedToConnectToPhoton. StatusCode: " + parameters + " ServerAddress: " + PhotonNetwork.networkingPeer.ServerAddress);
	}

	}