制作進捗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日。せめてこの期間中に対戦実装は終わらせたい。。
というわけで、次はオブジェクトの同期周りを対応していきます。