阿星的Unity教學部落格

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

【Unity】我也想使用Photon #02 連接伺服器的流程

原文
www.urablog.xyz
文中出現的[方法](https://docs.microsoft.com/zh-tw/dotnet/csharp/programming-guide/classes-and-structs/methods) 為C#方法的簡稱。

 從上一篇開始就打算使用Photon去製作多人連線遊戲。
 但是光介紹一個Connect方法、就花了很多時間。
在Photon中有著事件用的方法當「連接成功」 「已進入房間」等的狀況會被呼叫。
 這次要介紹Photon中網路連接用的方法、並且去理解連接成功與否會被呼叫的方法與流程。


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

Photon事件方法

   在Photon中、當「連接成功」 「已進入房間」等的狀況專用事件方法會被呼叫。
   這個呼叫方式並非使用C# Delegate做呼叫、而是利用GameObject的SendMessage()去呼叫。
   就像Unity事件方法中的Awake()Update()、方法名稱與
參數型別與參數數量是正確的話就會被呼叫。
   達成被呼叫的條件也很簡單、只要繼承MonoBehaviour的類別就OK了。

   正因為很簡單、使用很多事件函數的類別有可能使得程式碼變得更複雜、這點需要注意。
   那麼到底有哪些事件方法可以使用呢?
  直接看IPunCallbacks的script reference可能是最快的。
[阿星Tip]:IPunCallbacks位於PhotonClasses類別當中。

Photon Unity Networking: IPunCallbacks Interface Reference

好多阿……。

   雖然MonoBehaviour類別也有很多事件方法、Update()OnCollisionEnter()之類的、使用頻率也很高、這類型的方法先記起來會比較好。

關於 Auto-Join Lobby

 雖然後面會從沒有連接伺服器的狀態到連接伺服器後的狀態去做整體流程研究、當Auto-Join Lobby 是有效的情況時、事件函數的呼叫方式也會改變、這一點需要注意。
 Auto-Join Lobby 可以在 PhotonServerSettings 檔案中的Auto-Join Lobby的勾選框內設定、以及PhotonNetwork.autoJoinLobbyAPI中屬性也可以設定。

f:id:starlove124760:20171115012631p:plain

f:id:starlove124760:20171115012638p:plain

從未連接狀態到連接狀態可使用的方法們

   試著整理了從Photon未連接的狀態到變成Photon連接的狀態之前、可使用的方法與被呼叫的事件方法。

使用到的方法

  • ConnectUsingSettings()
    連接Photon的方法。
    關於Connect方法們前一篇已經徹底調查了很多這次就不再介紹了、詳細請參考以下連結。

    starlove.hatenablog.com

會被呼叫的事件方法

  • void OnConnectedToPhoton()
    第一次連接到Photon Server的時候會被呼叫。
    這個方法被呼叫的時候、PUN (Unity)這端的服務是還沒有準備好的狀態

  • 如果要接收到已可使用PUN的方法、使用OnConnectedToMaster()OnJoinedLobby()會比較好。

  • void OnConnectedToMaster()
    與MasterClient連接是確定而且認證後的時候會被呼叫。
    Auto-Join Lobby有效(Is True)的情況下、這個方法就不會被呼叫。

  • void OnJoinedLobby()
    進入主機Server的大廳的時候會被呼叫。
    Auto-Join Lobby有效(Is True)的情況下、連接以後就被呼叫。

  • void OnReceivedRoomListUpdate()
    大廳內的房間列表更新的時候會被呼叫。
    OnJoinedLobby()被呼叫的同時也會呼叫這個方法。

  • void OnFailedToConnectToPhoton( DisconnectCause cause )
    連接不到Server的時候會被呼叫。

  • void OnConnectionFail( DisconnectCause cause )
    不知道什麼原因而連接失敗的時候會被呼叫。

  • void OnPhotonMaxCccuReached()
    同時連接的數量達到上限時會被呼叫。

  • void OnDisconnectedFromPhoton()
    從PhotonServer被切斷連接時呼叫。

[阿星Tip]:如果對以上的介紹有疑慮可以參考原文API說明

Photon Unity Networking: IPunCallbacks Interface Reference

未連接到連接狀態的流程。

    雖然已經了解到連接成功或失敗的時候會被呼叫的方法了、但還是有點搞不清楚整體的連接流程。 
   我覺得如果整理出來一個流程圖的話、一定能夠徹底了解完整的連接流程、所以製作了以下兩個流程圖。
   首先是Auto-Join Lobby 無效(Is False)的情況。

f:id:starlove124760:20171121075401j:plain


   再來是Auto-Join Lobby 有效(Is True)的情況。

f:id:starlove124760:20171121074945j:plain

   查了以後、得出這些結論。
   做了流程圖後也變得很容易了解了呢。
   在Photon框架內有著同一個Frame中同時被執行的事件方法、所以需要特別注意。
 

   下回是連接成功後的流程介紹。

下一篇

starlove.hatenablog.com

前一篇

starlove.hatenablog.com