This document is about: FUSION 1
SWITCH TO

Dedicated Server

Level 4

概述

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.prefabNetworkRunner預製件由伺服器使用。它含有指令碼以管理完整的遊戲,主要的是下述的GameManager
  • Server_Manager.prefab:它將檢查目前的遊戲的執行個體是否在 無周邊模式 下運行,並且繁衍Server_NetworkRunner.prefab,也擷取必要的引數以客製化Fusion伺服器。
  • Client_NetworkRunner.prefabNetworkRunner預製件由客戶端使用。它也負責擷取來自玩家的輸入。
  • 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+中可找到,並且特定地針對這個目的而設計,移除不必要的檔案並且有一個更好的與終端機的整合。更多關於這個組建目標的資訊,可以在此找到。
如果您更改組建目標平台(舉例而言,從獨立到專用伺服器),請確保針對該特定目標,在指令碼定義符號中定義FUSION_WEAVER符號。否則,Fusion將無法編織您的專案。
Unity獨立組建目標
Unity專用伺服器組建目標(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的三個主要的方式。

  1. 全自動:同儕節點將開始及繫結到任何作業系統提供給通訊端層的可用的埠。這將適用於大多數 需要預先定義埠的案例。STUN協定 將用於解析同儕節點的 公共端點 (IP:Port)。這主要適用於預設情況下不阻擋埠的常見網路,比如家用網際網路連線。

C#

NetworkRunner.StartGame(new StartGameArgs() {
    GameMode = GameMode.Server
    // other args
});
  1. 預先定義的本機端點及自動公共端點:類似於案例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
});
  1. 預先定義的本機及公共端點:從案例2擴展,可以設定同儕節點的 本機端點公共端點。針對 公共端點 探索,Fusion將完全繞過 STUN協定 的使用,並且只轉送被傳送為引數的探索。在示例中,同儕節點如同案例2將繫結到相同的 本機端點,但也使用特定的 公共端點 10.0.0.1:27030CustomPublicAddress引數旨在用於主機端服務已經提供 本機公共 端點 之間的對應的案例。

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
});

客戶端模式

只需正常地啟動應用程式,以一般方式按兩下,將針對遊戲的客戶端來開啟附有一些選項的遊戲視窗。
從這裡開始,可以:

  1. 填入Session Name欄位來加入一個特定遊戲或保持它空白並且加入一個隨機遊戲。
  2. 加入預設ClientServer大廳或加入透過Custom Lobby欄位指定的一個自訂大廳。
    • 如果加入一個大廳,將呈現來自該特定大廳的可用的Game Sessions清單,附有按一下Join按鈕以加入一個遊戲的選項。
    • 也可以透過Shutdown按鈕從大廳來關機NetworkRunner並重新啟動。

當連線到Game Server,各個客戶端將收到一個玩家,其可以使用一般的 WASD 來控制,以在關卡中四處移動。
一個客戶端可以按一下Shutdown按鈕,自行從伺服器中斷連線,也將再次載入Menu場景。

Back to top