Dedicated Server
概述
Fusion專用伺服器範例 展示了一個Fusion專案可以圍繞在一個Dedicated Game Server
的概念來組建的方式,所以可以組建一個遊戲的無周邊執行個體,其將作為遊戲伺服器。
一個Dedicated Server
只不過是在Server Mode
中啟動的一個Fusion同儕節點,這意味著 沒有 一個本機Player
,並且它將在整個Game State
上作為State Authortity
。
範例用於偵測執行個體是否在無周邊模式下運行,因此它可以在Server Mode
自動啟動,以及有一個簡單的選單,以客戶端來啟動並加入一個隨機的Game Session
,或是加入一個Lobby
並且選擇一個特定的Session
來加入。
在您開始之前
為了運行範例,首先在PhotonEngine儀表板中建立一個Fusion應用程式帳號,並且將它貼上到即時設定(可從Fusion選單中到達)中的App Id Fusion
欄位之中。
下載
版本 | 發佈日期 | 下載 | ||
---|---|---|---|---|
1.1.6 | 2023年6月2日 | Fusion專用伺服器1.1.6組建194 |
預製件
Server_NetworkRunner.prefab
:NetworkRunner
預製件由伺服器使用。它含有指令碼以管理完整的遊戲,主要的是下述的GameManager
。Server_Manager.prefab
:它將檢查目前的遊戲的執行個體是否在 無周邊模式 下運行,並且繁衍Server_NetworkRunner.prefab
,也擷取必要的引數以客製化Fusion伺服器。Client_NetworkRunner.prefab
:NetworkRunner
預製件由客戶端使用。它也負責擷取來自玩家的輸入。Client_Manager.prefab
:建立一個簡單的GUI以讓一個客戶端加入一個特定的或一個隨機的遊戲階段,或加入一個大廳並且檢查可用的遊戲階段。使用Client_NetworkRunner.prefab
。Player.prefab
:一個簡單的玩家,當一個客戶端加入遊戲時,其將由伺服器繁衍。
場景
0.Launch
:啟動場景持有一個Server_Manager.prefab
執行個體,並且將用作為伺服器的開始點,以在 無周邊模式 中運行時載入Game
場景,或只是在一個正常的案例中載入Menu
場景。1.Menu
:這個場景只由客戶端執行個體使用,並且它展示由Client_Manager.prefab
組建的簡單的選單。2.Game
:一個基礎的遊戲場景,其中玩家將被繁衍並且可以四處移動。
指令碼
SceneDefs
:按照索引來持有場景清單,因為它讓它更容易來參照。CommandLineUtils
:方法集,以檢查執行個體是否運行在 無周邊模式(命令列含有-batchmode -nographics
)中,並且從透過命令列傳送的引數中取得值。ServerManager
:使用CommandLineUtils
來在開始Game Server
或載入Menu
場景間選擇。如果開始伺服器,將嘗試載入以下引數:-session
:伺服器將使用的自訂遊戲階段名稱。-region
:伺服器必須連線的自訂地區。已支援地區的清單。-lobby
:將建立遊戲階段的自訂大廳。-port
:伺服器在啟動時將嘗試繫結的自訂埠。-P
:自訂屬性的集。
GameManager
:只在伺服器上運行,並且在加入/離開時將基本地繁衍/取消繁衍玩家。ServerEventsInfo
:它將在伺服器端記錄來自Fusion的最常見的事件。ClientManager
:控制客戶端選單,並且使用Client_NetworkRunner.prefab
以連線到遊戲伺服器。PlayerController
:簡單的控制器,其將讀取來自客戶端的輸入,並且移動Player NetworkObject
。InGameMenu
:當在Game
場景中作為一個客戶端運行時,它將顯示 關機 按鈕。
如何運行
為了運行範例,請確保所有三個場景在Scene in Build
(啟動、選單、遊戲)中是正確的次序。
這將確保應用程式可以檢查命令列引數,並且啟動伺服器或客戶端。
下方說明如何開始各個模式。
專用伺服器模式
在這個模式中,一個Game Server
將使用預設設定或啟動時傳送的任何自訂引數來啟動。考慮到伺服器是在沒有任何顯示或視覺效果下執行的,因此有少量強制性引數及一些可選的引數。
Game Server
可以使用兩個主要組建目標來組建:
Standalone Build
:這是常見的組建目標,用於針對主要平台(Windows、Linux、macOS)來組建可執行檔。在這個案例中有少數缺點:(i)組建將含有所有遊戲資產及(ii)一旦被執行,它將在背景中運行(強制它關閉將需要刪除處理程序);Dedicated Server Build
:這個組建目標只在Unity 2021.2+中可找到,並且特定地針對這個目的而設計,移除不必要的檔案並且有一個更好的與終端機的整合。更多關於這個組建目標的資訊,可以在此找到。
從組建所在的資料夾開始,打開一個終端主控台並且輸入以下內容:
.\FusionDedicatedServerSample.exe -batchmode -nographics -logFile output.log
這樣就足以運行Game Server
,建立一個新的Game Session
,並且使用所有預設設定基於主機端機器位置在 最佳地區 中發佈。
讓我們分解引數:
-batchmode -nographics
(強制性):這將在 無周邊模式 中執行Unity執行個體。這觸發Game Server
的啟動。-logFile output.log
(選擇性):這將在相同的資料夾中建立一個檔案名為output.log
,其附有所有來自伺服器的記錄。
上述引數全部是與Unity相關,並且關於它們的更多資訊可以在此處找到。
如同先前所述,Game Server
可以剖析額外的引數,以一些示例值在下方說明:
.\FusionDedicatedServerSample.exe -batchmode -nographics -logFile output.log -session my-custom-session -region us -lobby my-custom-lobby -port 30001 -Pmap city -Ptype free-for-all
有了上述的調用,Game Server
將:
-session <custom session name>
(選擇性):以 我的-自訂-遊戲階段 名稱來開始一個Game Session
。預設是一個隨機的 GUID;-region <region ID>
(選擇性):連線到地區 US。預設是 最佳地區;-lobby <custom lobby name>
(選擇性):在名為 我的-自訂-大廳 的Lobby
上發佈Game Session
。預設是 客戶端伺服器 大廳;-port <custom port number>
(選擇性):繫結埠 30001。預設是27015
;-P<property name> <value>
(選擇性):以及設定自訂屬性 地圖 = 城市 及 類型 = 對所有人免費。預設是一個空白清單。
上述引數都不是強制性的,並且可以單獨使用或與其他它們的任何特定子集合混合使用。
一旦啟動,Game Server
將等待客戶端加入,並且當所有客戶端從遊戲階段中斷連線時將自動關機並且關閉。
API
在伺服器模式運行 Photon Fusion 是非常直接的,但是取決於伺服器將在執行中的主機端機器的網路特性,可能需要以不同的方式設定它。
因為這個理由,下方顯示了以GameMode.Server
來開始一個Fusion的三個主要的方式。
- 全自動:同儕節點將開始及繫結到任何作業系統提供給通訊端層的可用的埠。這將適用於大多數 不 需要預先定義埠的案例。STUN協定 將用於解析同儕節點的 公共端點 (
IP:Port
)。這主要適用於預設情況下不阻擋埠的常見網路,比如家用網際網路連線。
C#
NetworkRunner.StartGame(new StartGameArgs() {
GameMode = GameMode.Server
// other args
});
- 預先定義的本機端點及自動公共端點:類似於案例1,但是這裡一個特定的 本機端點 被設定為由 伺服器 使用。如果有任何其他 服務 繫結於該相同的埠,則同儕節點將無法啟動,所以請確保它可用。在示例程式碼中,伺服器 將嘗試繫結 端點
192.168.0.10:27015
,其必須是與主機端機器的一個網路卡及一個空閒的port
相關聯的一個IP
。如果不需要指定一個本機IP
,而只需要指定port
,則請改為使用NetAddress.Any(27015)
(意味著0.0.0.0:27015
)。這適用於在 主機端防火牆 上已打開供通信的可用埠的受限清單的案例,所以必須維持一些特定的埠。
C#
NetworkRunner.StartGame(new StartGameArgs() {
GameMode = GameMode.Server,
Address = NetAddress.CreateFromIpPort("192.168.0.10", 27015) // or NetAddress.Any(27015)
// other args
});
- 預先定義的本機及公共端點:從案例2擴展,可以設定同儕節點的 本機端點 及 公共端點。針對 公共端點 探索,Fusion將完全繞過 STUN協定 的使用,並且只轉送被傳送為引數的探索。在示例中,同儕節點如同案例2將繫結到相同的 本機端點,但也使用特定的 公共端點
10.0.0.1:27030
。CustomPublicAddress
引數旨在用於主機端服務已經提供 本機 及 公共 端點 之間的對應的案例。
C#
NetworkRunner.StartGame(new StartGameArgs() {
GameMode = GameMode.Server,
Address = NetAddress.CreateFromIpPort("192.168.0.10", 27015),
CustomPublicAddress = NetAddress.CreateFromIpPort("10.0.0.1", 27030)
// other args
});
客戶端模式
只需正常地啟動應用程式,以一般方式按兩下,將針對遊戲的客戶端來開啟附有一些選項的遊戲視窗。
從這裡開始,可以:
- 填入
Session Name
欄位來加入一個特定遊戲或保持它空白並且加入一個隨機遊戲。 - 加入預設
ClientServer
大廳或加入透過Custom Lobby
欄位指定的一個自訂大廳。- 如果加入一個大廳,將呈現來自該特定大廳的可用的
Game Sessions
清單,附有按一下Join
按鈕以加入一個遊戲的選項。 - 也可以透過
Shutdown
按鈕從大廳來關機NetworkRunner
並重新啟動。
- 如果加入一個大廳,將呈現來自該特定大廳的可用的
當連線到Game Server
,各個客戶端將收到一個玩家,其可以使用一般的 WASD 來控制,以在關卡中四處移動。
一個客戶端可以按一下Shutdown
按鈕,自行從伺服器中斷連線,也將再次載入Menu
場景。