前回:Photon Unity Networking (PUN) をインストールする
PUNのインストールまではできましたので、今回はチュートリアルを進めてみます。
目次
マルコ・ポーロ・チュートリアル
この続き。謎のモンスターがログインしただけ増えるというもの。なぜマルコ・ポーロなのかは謎。
また、このチュートリアルページ、いくつか情報が古かったり日本語が怪しかったりするので適宜補足していきたいと思います。
Photon Cloudの設定
まず新しくプロジェクトを作成して、PUNアセットをインストールした状態にします。
そして、「Window > Photon Unity Networking > Highlight Server Settings」で、「Auto-Join Lobby」にチェックを入れます。
ついでにRegionも「JP」にしておきます。このくらいだとEUでも影響ないんですがなんとなく。

ロビーへの接続
Assets以下に「Marco Polo」フォルダを作り、「RandomMatchmaker」スクリプトを作ります。
これがルームへのログインなどをすることになります。
このクラスのStartにPhotonServerへの接続を、OnGUIに状態の表示を書きます。
using UnityEngine;
public class RandomMatchmaker : MonoBehaviour
{
// Use this for initialization
void Start()
{
PhotonNetwork.ConnectUsingSettings("0.1");
}
void OnGUI()
{
GUILayout.Label(PhotonNetwork.connectionStateDetailed.ToString());
}
}
…で、クラスを作成しようとすると「error CS0101: The namespace `global::' already contains a definition for `RandomMatchmaker'」というエラーになります…
どうもPUNアセットに、すでにマルコ・ポーロのデモが入っているよう。「Assets/Photon Unity Networking/Demos」をまるごと削除します。
そして先ほどのコードを記述して、SceneにGameObjectを追加し、それにRandomMatchmakerスクリプトを追加します。
実行してみると、左端に「JoinedLobby」と出ます。(Gameの画面サイズを調整しないと文字が表示されないかもしれません。私は16:9にしました)
これでPhoton Serverと接続することができました。
接続できない場合は、ネットワーク環境を見直してみて下さい。
以下のページにあるポート番号がFWなどで邪魔されていないか確認してみるとよいと思います。
PUNコールバックの設定
ここではPUNの状態が何か変化したときに受け取るコールバックを設定します。
PUNでは、まず「ロビー」に入り、そこからそれぞれの「ルーム」に入室するという手順を撮ります。
ロビーに入ったときのコールバックを拾い、ルームへの入室または作成を行うというわけです。
先のRandomMatchmakerクラスを修正していきます。
まず継承元がMonoBehaviourでしたが、これを「Photon.PunBehaviour」に変更します。
ファイルの先頭にも「using Photon;」を追加します。
(ただ必ずしもPunBehaviourを継承する必要はなく、overrideで補完が効くから安心、ということのようです。コールバックメソッドの名前と引数が合っていれば呼び出されるようです)
それでロビーにjoinしたときのコールバックを実装します。そこに、どれでもいいからルームへ入室する処理を書いておきます。
using UnityEngine;
using System.Collections;
using Photon;
public class RandomMatchmaker : Photon.PunBehaviour {
// Use this for initialization
void Start () {
PhotonNetwork.ConnectUsingSettings("0.1");
}
void OnGUI()
{
GUILayout.Label(PhotonNetwork.connectionStateDetailed.ToString());
}
/// <summary>
/// ロビーにjoinしたとき
/// </summary>
public override void OnJoinedLobby()
{
// ルームのどれかに入室する
PhotonNetwork.JoinRandomRoom();
}
}
ここまではこんな感じ。しかし実行しても入室できないと思います。ルームが一つも無いからです。
エラーレベルの変更
ここで少し、エラーレベルの変更をしてみます。RandomMatchmaker#Start()に
PhotonNetwork.logLevel = PhotonLogLevel.Full;
と追加すると、より詳細なエラーが出るようになります。
エラー時のコールバックを追加
で、ランダムなルームへの入室に失敗したときのコールバックを追加します。
/// <summary>
/// ルームへのランダム入室に失敗
/// </summary>
/// <param name="codeAndMsg"></param>
public override void OnPhotonRandomJoinFailed(object[] codeAndMsg)
{
Debug.Log("Can't join random room!");
}
これで実行してみると、Consoleにメッセージが出てくるので、失敗したらこの処理に来ているのがわかります。
似たようなコールバックでも「OnPhotonJoinRoomFailed」とは違うようなので注意が必要です。
ルームを作成する
さてこのOnPhotonJoinRoomFailedでルーム入室失敗が拾えたので、失敗したらルームを新規で作って入室するようにしてみます。
このコールバックを、
public override void OnPhotonRandomJoinFailed(object[] codeAndMsg)
{
PhotonNetwork.CreateRoom(null);
}
と変更すると、ルームを作成して入室してくれます。
実行してみると、

左上のステータスも「Joined」になりました!
CreateRoomの引数にはルーム名を指定するようですが、nullの場合はランダムで作ってくれるようです。
static bool PhotonNetwork.CreateRoom ( string roomName )
ひとまずルームに入室できたところまでで次回に続く。
次回:Photon Unity Networking (PUN)のチュートリアルをやってみる (2)
