前回からPhotonを使ってオンラインマルチプレイゲームを作ろうと画策しています。
Connect関数一つ呼ぶだけで、えらく手間取ってしまいました。
Photonでは「接続できた」「ルームに入った」などの状況になるとイベント用の関数が呼ばれます。
今回はPhotonでネットワークに接続する関数と、接続の成否によって呼ばれるイベント関数の流れについて調べていきます。
この記事にはUnity5.4.1f1及びPUN1.75を使用しています。
Photonのイベント関数
Photonでは「接続できた」「ルームに入った」などの状況になると専用の関数が呼ばれます。
この呼ばれ方はデリゲートなどを用いて呼ばれるのではなく、GameObjectのSendMessage()
を利用して呼ばれます。
そのため、Unityイベント関数のAwake()
やUpdate()
のように、関数名と引数の型と数が正しければ呼ばれます。
呼び出される条件もMonoBehaviour
クラスを継承しているクラスならOKととても簡単です。
簡単である反面、めったやたらにイベント関数を多くのクラスに記述するとコードが煩雑になってしまう可能性があるため注意が必要です。
では一体どんなイベント関数があるのでしょう。
IPunCallbacks
のスクリプトリファレンスが一番見やすいかもしれません。
https://photonengine.jp/pun-api/interface_i_pun_callbacks.html
多い……。
MonoBehaviour
クラスも多いけど、Update()
やOnCollisionEnter()
使う頻度が高いものさえ覚えておけばよかったからなぁ。大変だ。
Auto-Join Lobbyについて
後述にて未接続状態から接続状態までの流れを調べていくのですが、Auto-Join Lobbyが有効になっている場合、イベント関数の呼ばれ方が変わってくるので注意が必要です。
Auto-Join Lobbyは、PhotonServerSettingsのAuto-Join Lobbyのチェックボックスで設定するか、PhotonNetwork.autoJoinLobby
のプロパティにて設定できます。
未接続状態から接続状態までに使う関数群
Photonネットワーク未接続状態からPhotonネットワーク接続状態になるまでに、使う関数と呼ばれるイベント関数についてまとめてみました。
使用する関数
ConnectUsingSettings()
Photonネットワークに接続する関数です。
Connect関数群に至っては前回散々調査したので今回は割愛。詳しくは以下のリンクへ。
www.urablog.xyz
呼ばれるイベント関数
void OnConnectedToPhoton()
最初の接続が確立したとき呼ばれるようです。
この関数が呼ばれたときには、まだPhotonの準備が整っていないようです。
接続確認には、後述のOnConnectedToMaster()
とOnJoinedLobby()
の方がいいみたいです。void OnConnectedToMaster()
マスターへの接続が確立し認証された際に呼ばれるようです。
Auto-Join Lobbyが有効な場合は、この関数は呼ばれません。void OnJoinedLobby()
マスターサーバーのロビーに入ったときに呼ばれるようです。
Auto-Join Lobbyが有効な場合は、接続後こちらが呼ばれます。void OnReceivedRoomListUpdate()
ロビー内のルームのリストが更新された際に呼ばれるようです。
OnJoinedLobby()
が呼ばれた際に同時に呼ばれます。void OnFailedToConnectToPhoton( DisconnectCause cause )
サーバーに到達できず接続できない際に呼ばれるようです。void OnConnectionFail( DisconnectCause cause )
何かのせいで(接続が確立した後)接続失敗したときに呼ばれるようです。void OnPhotonMaxCccuReached()
同時接続可能数の制限に到達した場合に呼ばれるようです。void OnDisconnectedFromPhoton()
Photonサーバーから回線を切断した後で呼ばれるようです。
未接続状態から接続状態までの流れ。
接続に成功したり失敗したりした際に呼ばれる関数は分かったのですが、流れが少し分かりにくいです。
図式化すればきっと分かりやすいのでは、と思いフローチャートにまとめてみました。
まずはAuto-Join Lobbyが無効な場合です。
次にAuto-Join Lobbyが有効な場合です。
調査した限り、こういう結果になりました。
フローチャートにするとわかりやすいですね。
同フレーム内に同時に実行されるイベント関数もあるので注意が必要です。
次回は接続済みの状態からの流れを見ていきます。