Unityでマルチプレイしてみよう(photon) 鍵付きの部屋を作ってみる

<a href="http://qiita.com/ayumegu/items/cfdeffc7278457c9e216">前回</a>の続き。
今回は以前とりあえず作った部屋のリストに今度は鍵付きの部屋を作った。
あとは前回自動でルームの一覧更新されてなかったのでそこも修正してみた
各種エラー処理や通信中の対応などはまだ入れてないです。

現在こんな感じ (Fps8で作成したgifですのでカクカクしてますが)
<img src="http://ayumegu.daa.jp/img/Qiita/Photon.gif">

鍵付きの部屋については
<a href="http://blog.photoncloud.jp/allow-invite-user/" target="_blank">招待者のみルームへ入室を許可する方法</a>ここを参考にすればさくっとできます。

簡単に流れだけ・・・

```csharp
// photon接続
PhotonNetwork.ConnectUsingSettings ("0.1");
```

```csharp
// ロビーに入ると呼ばれる
public void OnJoinedLobby(){
   Debug.LogWarning("ロビーに入りました");
}
```

```csharp
// ユーザーの名前が確定したら名前をセットする
PhotonNetwork.playerName = nameInputField.text;
```

```csharp
// 部屋が更新されたりで呼ばれる
public void OnReceivedRoomListUpdate()
{
	// 呼ばれた時にルームのリストを保持
	roomData = PhotonNetwork.GetRoomList();
	// ルーム一覧ウィンドウが開いていたら通知
	if(roomList.gameObject.activeSelf) roomList.UpdateRoom();
}
```

```csharp
// 現在のルームのデータを返す
public RoomInfo[] GetRoomList()
{
	return roomData;
}
```

```csharp
// ルーム一覧表示箇所
public void UpdateRoom()
{
	if(scrollTran.childCount > 0)
	{
		foreach(Transform tran in scrollTran)
		{
			Destroy(tran.gameObject);
		}
	}
	RoomInfo[] roomList = NetworkManager.Instance.GetRoomList();

	GameObject roomObj = null;
	foreach (RoomInfo room in roomList) {

		roomObj = Instantiate(Resources.Load(CommonConst.ROOM_ITEM)) as GameObject;
		roomObj.transform.SetParent(scrollTran);
		roomObj.transform.SetLocalPositionZ(0);
		roomObj.transform.localScale = Vector3.one;
		roomObj.GetComponent<RoomItem>().SetData(room);
	}
}
```

```csharp
	// 部屋を作る パスワードが入力された場合は部屋名 + "_" + パスワードで部屋を作成 
	public void CreateRoom(string roomName, int playerCount, string password)
	{
		string roomNameStr = roomName;
		if(!string.IsNullOrEmpty(password)) roomNameStr += "_" + password;
		Debug.LogWarning("部屋作成" + roomNameStr);
		PhotonNetwork.CreateRoom (
			roomNameStr, 	// ユニークな部屋名
			new RoomOptions() {maxPlayers = 10},
			null);
	}
```

```csharp
	// ルームのデータ表示箇所 文字列に_がある場合はsplitして名前の部分だけを表示し、鍵のアイコン表示
	public void SetData(RoomInfo roomData)
	{
		this.roomData = roomData;
		string roomName = roomData.name;
		string[] strList = roomName.Split("_"[0]);
		roomNameLabel.text = strList[0];
		if(strList.Length > 1 && !string.IsNullOrEmpty(strList[1]))
		{
			isLock = true;
			lockObj.SetActive(true);
		}
		playerCountLabel.text = roomData.playerCount + "/" + roomData.maxPlayers;
		if(roomData.playerCount == roomData.maxPlayers)
		{
			joinBtnText.text = "満室";
			joinBtnImg.color = gray;
		}
	}
```

##カスタムプロパティを追加
えっとこのままだと、ランダムに部屋に入る時に鍵付きの部屋にも入れちゃうので修正
部屋を作成する時にカスタムプロパティーが付けれるのと、ランダムログインの時にそのパラメータを条件にできるのでこれを使う。

```csharp
using Hashtable = ExitGames.Client.Photon.Hashtable; // これをしないとコンパイルが通らなかった・・・。

	public void CreateRoom(string roomName, int playerCount, string password)
	{
		string roomNameStr = roomName;
		bool isLock = false;
		if(!string.IsNullOrEmpty(password))
		{
			isLock = true;
			roomNameStr += "_" + password;
		}
		RoomOptions roomOptions = new RoomOptions();
		roomOptions.isVisible = true;
		roomOptions.isOpen = true;
		roomOptions.customRoomProperties = new Hashtable() {
			{ "isLock", isLock }, // 鍵がかかっているかどうか
			{ "status", (int)RoomState.WAIT }, // 今後使う部屋の状態 wait:待機 play:遊び中
			{ "round",   0 }, // なんとなくいれてみた
		};
		roomOptions.customRoomPropertiesForLobby = new string[] {
			"isLock",
			"status",
			"round",
		};
		PhotonNetwork.CreateRoom(roomNameStr, roomOptions, null);
	}

	// 適当に部屋に入る
	public void RandomEnter()
	{
		// 鍵が付いていない部屋に入る
		Hashtable expectedCustomRoomProperties = new Hashtable() { { "isLock", false } };
		PhotonNetwork.JoinRandomRoom(expectedCustomRoomProperties, 0); // 第二引数は部屋のmaxプレイヤー数、0は最大プレイヤー数なんでもとなる
	}

	// 部屋の表示(カスタムプロパティを取得してisLockで鍵の判定をするように修正)
	public void SetData(RoomInfo roomData)
	{
		this.roomData = roomData;
		string roomName = roomData.name;
		string[] strList = roomName.Split("_"[0]);
		roomNameLabel.text = strList[0];
		if((bool)roomData.customProperties["isLock"])
		{
			isLock = true;
			lockObj.SetActive(true);
		}
		playerCountLabel.text = roomData.playerCount + "/" + roomData.maxPlayers;
		if(roomData.playerCount == roomData.maxPlayers)
		{
			joinBtnText.text = "満室";
			joinBtnImg.color = gray;
		}
	}
```

一旦ここまで