Unityでマルチプレイしてみよう(photon) ルーム一覧作っただけ・・・


##とりあえず下準備
<a href="https://www.assetstore.unity3d.com/jp/#!/content/1786" target="_blank">Photon Unity Networking Free</a>をインポート

<a href="http://photonengine.jp/" target="_blank">photon</a>のサイトでユーザー登録をして、
アプリケーションIDをとってきます。
無料だと20人同時アクセスまで。
![photon1.png](https://qiita-image-store.s3.amazonaws.com/0/46444/fe1561a1-1756-0077-835e-4f35340b8a82.png)

アプリケーションIDをコピーして
Unity上からwindow->photon Unity Networking->PUN Wizardを開く
<img width="513" alt="スクリーンショット 2016-06-08 13.43.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/3b0df5bc-f849-f1d4-398b-71ff829fc0f7.png">

AppId or Emailの所に貼り付けてSetUp Project
Done!とでれば完了
<img width="300" src="https://qiita-image-store.s3.amazonaws.com/0/46444/4957f46c-39cb-ecf0-95a6-ec037cad6d77.png">

これでインポートしてきたやつのデモは動くよ。
一人じゃ意味ないからSceneを全部BuildSettingに突っ込んで
DemoHubがメニューなのでそれを一番上にしてビルド。

<img width="790" alt="スクリーンショット 2016-06-08 14.07.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/5c229e4f-aea5-c57f-5adc-fb0faf5cc5ce.png">

はい、これUnity上のとビルドしたやつ起動して一人二役完成!
<img width="1332" alt="スクリーンショット 2016-06-08 14.08.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/513deedb-8c31-29d4-a3af-3f8f4a0a92f5.png">
これはDemo Wokerのシーン。これはルームの作成の機能も入っているし、チャットも出来るよ。
<img width="1391" alt="スクリーンショット 2016-06-08 14.10.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/4d0f8727-73ea-e1be-9c67-c06ccfa46d9f.png">

<a href="https://photonengine.jp/pun-api/index.html" target="_blank">PUN APIリファレンス（Ver.1.60）</a>
Photon Turnbasedってないなと思ってなら終わってたのか・・・。
じゃぁリアルタイムだけでいいや。
<a href="https://photonengine.jp/info/detail.php?no=1463734387" target="_blank">Photon Turnbased 新規受注受付終了のご案内</a>


##とりあえずログインの仕方を・・・
うーんっと、まず最初に必要なのが、アプリケーションのバージョン番号の記載が必要。

```csharp
PhotonNetwork.ConnectUsingSettings("バージョン番号");
```

```csharp
//Roomに参加
PhotonNetwork.JoinRoom(roomName);

//Roomを作成
PhotonNetwork.CreateRoom(roomName);
//既に存在する場合は失敗し、これをコール：: OnPhotonCreateGameFailed
//CreateRoomの引数RoomOptionsでルームの人数を設定したりできる

//ランダムにどのRoomにでも参加する
PhotonNetwork.JoinRandomRoom();
//マッチするゲームが無い場合、失敗、そしてこれをコール：: OnPhotonRandomJoinFailed
```

パスワード付きの部屋を作りたい場合はこちらを参考にすればできる。なるほど！
<a href="http://blog.photoncloud.jp/allow-invite-user/">招待者のみルームへ入室を許可する方法</a>

ルームの一覧表示

```csharp
foreach (RoomInfo room in PhotonNetwork.GetRoomList())
{
    Debug.Log(room.name);  //部屋名
    Debug.Log(room.playerCount); 	//部屋の入場人数
    Debug.Log(room.maxPlayers);	 //最大人数
}

```

##お部屋作ってみよう！
とりあえず部屋作ろうと思って、はまりました。
ランダムで入室や部屋作成は出来るのに、
部屋一覧がどうやっても取得できないという・・・・。
**原因はPhotonServerSetingのAuto-Join Lobbyのチェック
これを入れないとロビー一覧取得できない**
![スクリーンショット-2016-06-08-23.58.35.png](https://qiita-image-store.s3.amazonaws.com/0/46444/ba024499-40eb-47fe-5e89-67fd943d376b.png)

ちょっと作りがちゃっちいけど、
とりあえず名前決めて部屋の作成、部屋への参加、ランダムな部屋に参加の実装をした
<img src="http://ayumegu.daa.jp/img/Qiita/PhotonLobbyTest.gif">

次に鍵付きの部屋も作ってみようと思ってるけどまだ未実装。
一部だけどソース

部屋をつくるところ

```csharp
	public void CreateRoom(string roomName, int playerCount, string password)
	{
		string roomNameStr = roomName;
		if(!string.IsNullOrEmpty(password)) roomNameStr += "_" + password;
		PhotonNetwork.CreateRoom (
			roomNameStr, 	// ユニークな部屋名
			new RoomOptions() {maxPlayers = playerCount},
			null);
	}

	public void OnPhotonCreateRoomFailed()
	{
		Debug.Log("OnPhotonCreateRoomFailed got called. This can happen if the room exists (even if not visible). Try another room name.");
	}

	public void OnPhotonRandomJoinFailed()
	{
		Debug.Log("OnPhotonRandomJoinFailed got called. Happens if no room is available (or all full or invisible or closed). JoinrRandom filter-options can limit available rooms.");
	}

	public void OnCreatedRoom()
	{
		PhotonNetwork.LoadLevel("Room");
	}
```

部屋の一覧表示しているところ

```csharp
		if (PhotonNetwork.GetRoomList().Length == 0)
		{
			Debug.LogWarning("部屋なし");
		}
		else
		{
			GameObject roomObj = null;
			foreach (RoomInfo room in PhotonNetwork.GetRoomList()) {

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

		}
```

ランダムな部屋に入るところ

```csharp

public void RandomEnter()
	{
		PhotonNetwork.JoinRandomRoom();
	}

	public void OnJoinedRoom()
	{
		Debug.Log("OnJoinedRoom");
		PhotonNetwork.LoadLevel("Room");
	}

	public void OnPhotonRandomJoinFailed()
	{
		Debug.Log("OnPhotonRandomJoinFailed got called. Happens if no room is available (or all full or invisible or closed). JoinrRandom filter-options can limit available rooms.");
	}
```

部屋に入るところ

```csharp
	public void Join()
	{
		PhotonNetwork.JoinRoom(roomData.name);
	}

	// We have two options here: we either joined(by title, list or random) or created a room.
	public void OnJoinedRoom()
	{
		Application.LoadLevel("Room");
	}

	public void OnPhotonJoinRoomFailed(object[] cause)
	{
		Debug.Log("OnPhotonJoinRoomFailed got called. This can happen if the room is not existing or full or closed.");
	}
```

macのスタンドアローンでビルドしたやつでもターミナルからこんな感じで
open -n Test.app
作ったアプリの名前を叩けば複数起動できるから一人で賑やかに遊べるよ!

![スクリーンショット 2016-06-09 00.34.45.png](https://qiita-image-store.s3.amazonaws.com/0/46444/872cd3e0-ebbf-6335-fa3d-b900d45b2a60.png)


##ちなみに部屋に入ってから部屋を抜けるときは
```csharp
  // これで部屋を抜けて
  PhotonNetwork.LeaveRoom();  
  // 抜けられたらこの関数がよばれるからここでシーンを切り替えるなりする
  public void OnLeftRoom()
  {
  }
```

疲れたので一旦ここまで。スマホで試す余力もなかったw
次は鍵付きのお部屋にカスタマイズしようかな

###余談・・・
スマホでビルドしようとおもって、いつもお世話になっている
Fast Platform Switch
を使おうとしたら、販売中止になっておった・・・。
こういうことがあるからパッケージが消せない・・・。
Asset Store-5.xだけで44GBも使っている;w;容量がどんどん圧迫されていく・・・
なんとかならないかな・・・。