うら干物書き

ゲームを作っています。

【Unity】僕もPhotonを使いたい #03 接続からの流れ

 さて今回もPhotonについて調べていきますよー。
 前回はPhotonネットワークに未接続の状態から接続状態に至るまで調査しました。
 今回は接続状態からの流れを調べていきます。


この記事にはUnity5.4.1f1及びPUN1.75を使用しています。

未接続状態から接続状態について

www.urablog.xyz

接続状態とAuto-Join Lobbyの関係

 今回この記事内で使用している「Photon接続状態」とは、OnConnectedToMaster()後の状態を指しています。
 Auto-Join Lobby有効な場合は、接続後間髪いれずにすぐにデフォルトロビーに入ってしまいます。
 そのため、OnConnectedToMaster()が呼ばれず、今回調査する「Photon接続状態」にはなりません。
 ロビーからの流れについてはまた後日調査予定です。

接続状態からの流れで使う関数群

 接続状態で使用する関数と呼ばれるイベント関数についてまとめてみました。
 接続状態ではロビーにも入れますし、ルームの作成や入場も可能です。
 ロビーに入っているときとの違いは、ルームの一覧を見ることが出来ない点です。

使用する関数

 スクリプトリファレンス参照
Photon Unity Networking: PhotonNetwork Class Reference

  • bool PhotonNetwork.JoinLobby()
    bool PhotonNetwork.JoinLobby( TypedLobby typedLobby )
    ロビーに入ります。ロビーに入ればロビー内のルームの一覧が見れます。
    引数指定すれば、指定したタイプのロビーに、引数の指定しない場合は、デフォルトのロビーに入場します。

  • bool PhotonNetwork.CreateRoom( string roomName )
    bool PhotonNetwork.CreateRoom( string roomName, RoomOptions roomOptions, TypedLobby typedLobby )
    bool PhotonNetwork.CreateRoom( string roomName, bool isVisible, bool isOpen, int maxPlayers )
    bool PhotonNetwork.CreateRoom( string roomName, bool isVisible, bool isOpen, int maxPlayers, Hashtable customRoomProperties, string[] propsToListInLobby )
    ルームを作成します。最大入場可能人数やルーム一覧を表示するかなどを指定できます。
    ロビー内に同じ名前のルームを作成することは出来ません。

  • bool JoinRoom( string roomName )
    bool JoinRoom( string roomName, bool createIfNotExists )
    ルームに入ります。指定した名前のルームが無かったり、ルームが満室だったり閉まっていたら失敗します。
    createIfNotExistsをtrueで渡すことで、ルームが無い場合は同時に作成されます。

  • bool JoinOrCreateRoom( string roomName, RoomOptions roomOptions, TypedLobby typedLobby )
    CreateRoom()JoinRoom()が合体したような関数です。
    指定したルームが既にあるならばそのルームに入り、無ければルームを作成します。

  • bool JoinRandomRoom()
    bool JoinRandomRoom( Hashtable expectedCustomRoomProperties, byte expectedMaxPlayers )
    bool JoinRandomRoom( Hashtable expectedCustomRoomProperties, byte expectedMaxPlayers, MatchmakingMode matchingType, TypedLobby typedLobby, string sqlLobbyFilter )
    どこでもいいから入場可能なルームに入る関数です。
    引数を指定すれば、入るルームの条件を絞り込むことが出来ます。

  • void Disconnect()
    Photonネットワークから切断します。

呼ばれるイベント関数

 スクリプトリファレンス参照
Photon Unity Networking: IPunCallbacks Interface Reference

  • void OnJoinedLobby()
    マスターサーバーのロビーに入ったときに呼ばれるようです。

  • void OnReceivedRoomListUpdate()
    ロビー内のルームのリストが更新された際に呼ばれるようです。

  • void OnCreatedRoom()
    ルームを作成した際に呼ばれるようです。

  • void OnJoinedRoom()
    ルームに入った際に呼ばれるようです。

  • void OnPhotonCreateRoomFailed( object[] codeAndMsg )
    ルームの作成に失敗した際に呼ばれるようです。

  • void OnPhotonJoinRoomFailed( object[] codeAndMsg )
    ルームに入れなかった際に呼ばれるようです。

  • void OnPhotonRandomJoinFailed( object[] codeAndMsg )
    どのルームでもいいよといったにも関わらず、それでもルームに入れなかった際に呼ばれるようです。

  • void OnPhotonCustomRoomPropertiesChanged( Hashtable propertiesThatChanged )
    ルーム内のプロパティに変化があった際に呼ばれるようです。

  • void OnPhotonPlayerPropertiesChanged( object[] playerAndUpdatedProps )
    ルーム内のプレイヤーのプロパティに変化があった際に呼ばれるようです。

  • void OnDisconnectedFromPhoton()
    Photonサーバーから回線を切断した後で呼ばれるようです。

接続状態からの流れ

 今回もフローチャートにしてみました。
 前回と違ってパターンが多いです。

 ロビーに入ろうとした際の流れです。
 ロビーに入ろうとした際の失敗用のイベント関数がなかったのですが、失敗しないのかな。

f:id:urahimono:20160915225431p:plain

 ルームを作成しようとした際の流れです。

f:id:urahimono:20160915225455p:plain

 ルームに入ろうとした際の流れです。
 JoinOrCreateRoom()を使用する場合は、上記のルームを作成しようとする流れから入り、作成できなかった場合に以下の流れに入ります。

f:id:urahimono:20160915225511p:plain

 JoinRandomRoom()を使用してルームに入ろうとした際の流れです。

f:id:urahimono:20160915225523p:plain

 通信を切断する際の流れです。
 Disconnect()を呼ばずにLANケーブルを引っこ抜いて切断されるかも確認したのですが、エラーは起きるのですがOnDisconnectedFromPhoton()は呼ばれませんでした。
 うーむ、Wifiなどが突然切れ場合はどうなるのでしょうか。

f:id:urahimono:20160915072354p:plain

 調査結果はこんな感じです。

 次回はロビーに入った状態からの流れを見ていきます。

 次回 www.urablog.xyz

 前回 www.urablog.xyz