chronote

ゲーム創作活動の備忘録、日々の雑記など。

制作進捗10 ~光子に導かれ~


Photon のドキュメントを翻訳してると、ちょくちょく「光子」がでてくるのでつい・・・

今回は、PhotonUnityNetwork(以下PUN)の全体像を把握しつつ、
実際にマッチングしてバトルを開始するまで、を作ってみました。


ドキュメント

ざっくりと全体像を把握するのであれば、Photon Realtime の Reference 項目を
順に眺めるとよさげです。doc.exitgames.com


PUN 用のまともなリファレンスがぱっと見当たらなかったのですが、
検索すると PUN 日本語版のリファレンスが置いてあったので、
細かい使い方はこちらでなんとか把握できるかと思います。

photoncloud.jpphotoncloud.jp

http://photoncloud.jp/pdf/PhotonNetwork-Documentation_ja.pdf

例えば、特定のメソッドを使った結果のコールバックはこれ、
といった関連性を調べるには、日本語の正確な情報はここから得られます。
各種プロパティの説明もあるので、ここを検索するのが早いですね。


ランダムマッチングしてみる

Photon サーバに接続する方法の1つとして、簡単なやり方。

PhotonNetwork.ConnectUsingSettings("v0.1");

これを呼ぶだけ。接続完了/失敗のコールバックは次のとおり。

// [Callback] Photonサーバに接続完了
void OnConnectedToMaster();
// [Callback] Photonサーバに接続失敗
void OnFailedToConnectToPhoton(DisconnectCause cause);

コールバックは Photon.MonoBehaviour を継承した GameObject にて実装しました。

続いて、接続が完了している状態で何らかのボタンを押したら
マッチングを開始する、という流れを作りました。

//-------------------------------------------------------------------------
// ランダムマッチルームへの参加を試みる
PhotonNetwork.JoinRandomRoom();    // 何らかのトリガで呼ぶ

//-------------------------------------------------------------------------
// [Callback] ルームへの参加に失敗
public virtual void OnPhotonRandomJoinFailed()
{
     // 新たなルーム作成を試みる
     PhotonNetwork.CreateRoom(null, new RoomOptions() { maxPlayers = 2 }, null);
}

//-------------------------------------------------------------------------
// [Callback] ルーム作成に失敗
public virtual void OnPhotonCreateRoomFailed();

//-------------------------------------------------------------------------
// [Callback] ルームへの参加に成功
public virtual void OnJoinedRoom();

まずは、すでにルームがあることを想定して JoinRandomRoom() を行います。
そのまま参加できれば、OnJoinedRoom() が呼ばれて準備完了です。
あとはどこかの Update() などで対戦相手が揃っているか人数確認を行い、バトルへ移ります。

ルームへ参加できなかった場合、自らがマスターとなるルームを作成するために、
CreateRoom() を呼びます。
成功すれば同じく OnJoinedRoom() が呼ばれ、失敗すれば
OnPhotonCreateRoomFailed() が呼ばれるようです。(失敗動作は未検証)

例外処理など省いていますが、これだけでランダムマッチングができてしまいました。


条件マッチングもあるよ

完全ランダムではなく、ある程度の条件マッチングがしたい場合もありますが、
ちゃんと方法が用意されています。

CreateRoom()JoinRandomRoom() にプロパティを渡すことで、条件指定が可能です。
例えば、"map" : "3" で遊ぶ人を募集、といった"キー" : "値"が一致する相手、といった雰囲気です。

他にも、自分で条件演算子をカスタムできる SQLロビー という指定方法があります。
まだ必要ではないので触っていませんが、これを使えば、レベルがX以上Y以下の人を募集、
といった階級マッチングができますね。

さらに、フレンド検索をして、オンラインで見つかった相手だけが見えるルームを作り、
フレンドマッチングを行う、といったこともできるようですが、詳細は必要になってから調べます。


あとがき

あぁ、もうゴールデンウィークも残り2日。せめてこの期間中に対戦実装は終わらせたい。。
というわけで、次はオブジェクトの同期周りを対応していきます。