阿星的Unity教學部落格

預計會走向 日文Unity部落格翻譯、Photon研究、Unity小工具、Unity編輯器開發、框架研究

【Unity】我也想使用Photon #03 連接後的流程

原文
www.urablog.xyz

那麼這篇文章一樣是研究Photon內部結構。
前一篇是介紹Photon NetWork從未連接的狀態直到連接狀態。
這篇則是介紹連接到伺服器後的流程。


這篇文章是使用Unity5.4.1f1以及PUN1.75

關於未連接狀態到連接狀態

starlove.hatenablog.com

連接狀態與Auto-Join Lobby之間的關係

這次這篇文章內所說的「Photon連接狀態」指的是、OnConnectedToMaster()後的狀態。

Auto-Join Lobby有效的情況下、連接後立刻就進入了預設的大廳。
正因如此、OnConnectedToMaster()不會被呼叫、這次研究的內容不會進到Photon接続状態」
從進入大廳後的流程以後會說明。

關於連接狀態開始的流程使用的方法

整理了連接狀態下使用的方法也就是會被呼叫到的事件方法。

連接狀態下也會進入大廳、當然房間的產生與進入也是可能的。
與已經進入大廳的時候的差異是、無法看到房間列表。

能使用的方法

ScriptReference 參考
Photon Unity Networking: PhotonNetwork Class Reference

  • bool PhotonNetwork.JoinLobby()
    bool PhotonNetwork.JoinLobby( TypedLobby 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 Network 斷開連接。

會被呼叫的事件方法

ScriptReference 參考
Photon Unity Networking: IPunCallbacks Interface Reference

  • void OnJoinedLobby()
    進入MasterServer的大廳以後、會被呼叫的方法。

  • void OnReceivedRoomListUpdate()
    大廳內的房間列表更新時、會被呼叫的方法。

  • void OnCreatedRoom()
    自己建立房間以後會被呼叫的方法。

  • void OnJoinedRoom()
    加入房間以後會被呼叫的方法。

  • void OnPhotonCreateRoomFailed( object[] codeAndMsg )
    自己建立房間卻失敗時會被呼叫的方法。

  • void OnPhotonJoinRoomFailed( object[] codeAndMsg )
    加入房間失敗時會被呼叫的方法。

  • void OnPhotonRandomJoinFailed( object[] codeAndMsg )
    雖然說隨便進入一個可以進入的房間、即便如此還是有可能有進不去房間的情況、這時候這個方法就會被呼叫。
    [阿星Tip]:當沒有任何房間被建立時、並使用了JoinRandomRoom()   OnPhotonRandomJoinFailed就會被呼叫。

  • void OnPhotonCustomRoomPropertiesChanged( Hashtable propertiesThatChanged )
    房間的自訂屬性*1有改變的時候會被呼叫。

  • void OnPhotonPlayerPropertiesChanged( object[] playerAndUpdatedProps )
    房間內的玩家自訂屬性*2有改變時會被呼叫。

  • void OnDisconnectedFromPhoton()
    被從Photon Server 斷開連接時呼叫。

連接狀態以後的流程說明

這次也製作了流程表的圖。
與前一篇文章的模式有很多的不同。

連接大廳的流程。
但是少了進入大廳時失敗的事件函數、是否意味著進入大廳這件事情不會失敗呢?
(如同前面所介紹進入房間有可能會失敗)

f:id:starlove124760:20171202190850j:plain
建立房間時的流程。

f:id:starlove124760:20171202190924j:plain

房間進入的流程
使用JoinOrCreateRoom()的情況下、也會進入上面的房間建立的流程、如果建立失敗則進入以下連接房間流程。

f:id:starlove124760:20171202191120j:plain

使用JoinRandomRoom()去連接房間時的流程。

f:id:starlove124760:20171202191314j:plain

連接被中斷時的流程。

f:id:starlove124760:20171202192558j:plain


但如果沒有呼叫Disconnect()
而是直接把 LAN Cable 線給拔掉導致連線中斷的情況,雖然會引發錯誤訊息但OnDisconnectedFromPhoton()卻不會被呼叫到。
嗯…如果像是Wifi之類的突然斷線的情況會是如何呢?

研究結果如上。

下回是探討從大廳進入後的流程。

 

前一篇

starlove.hatenablog.com

*1:房間的自訂屬性為開發者可以自訂一些屬性,讓每個玩家都收到此屬性的設定,從而去設計功能

*2:如玩家的等級、經驗等等