概觀
PlayFab 多人遊戲伺服器需要與 PlayFab 遊戲伺服器 SDK (GSDK) 整合。此外,遊戲伺服器會在 PlayFab 多人遊戲平台上以容器化應用程式的形式執行。 以容器化應用程式的形式執行,可讓您在與 Azure 中 PlayFab 平台相符的環境中,於本機執行伺服器並進行偵錯。這有助於加快開發反覆項目。本文可協助您確認您的 PlayFab 遊戲伺服器符合平台需求。 PlayFab 本機偵錯工具組包含 LocalMultiplayerAgent,它會向 GSDK 提供模擬回應,並驗證您的遊戲伺服器是否已正確與 GSDK 整合。透過模擬回應,VmAgent 會讓遊戲伺服器循環經歷其在 PlayFab 多人遊戲平台上生命週期中的各種狀態。 您可以設定代理程式,以容器化應用程式的形式執行遊戲伺服器。確認您的遊戲伺服器已封裝所有必要的相依性,並可在 PlayFab 多人遊戲平台上順利執行。LocalMultiplayerAgent 可以搭配 Windows 或 Linux 遊戲伺服器使用。基本設定 - Windows
- 將您的遊戲伺服器與 GSDK 整合並建置。如需詳細資訊,請參閱將遊戲伺服器與 PlayFab 遊戲伺服器 SDK (GSDK) 整合。
- 將遊戲伺服器及其相依性壓縮為 zip 封存。若要在容器模式中正確執行,zip 封存必須包含容器映像中未包含的任何系統 DLL。如需詳細資訊,請參閱判斷必要的系統 DLL。
避免這個常見錯誤——不要意外地在 zip 中壓縮資料夾內的資料夾。壓縮後,請瀏覽 zip 資料夾,並再次確認您的壓縮軟體沒有新增額外的檔案階層。
- 下載本機偵錯工具組,並將其解壓縮至您選擇的資料夾 (例如 C:\PlayFabVmAgent)。
- 檢查 LocalMultiplayerAgent MultiplayerSettings.json 產生器 json 檔案時,請閱讀下方關於下列選項的詳細資訊。
-
瀏覽至解壓縮資料夾的位置,並在文字編輯器 (例如 Visual Studio Code) 中開啟 MultiplayerSettings.json 檔案。更新下列屬性:
LocalFilePath- 先前建立之遊戲伺服器資產 zip 檔案的完整本機路徑 (在您的工作站上),例如:D:\\MyAmazingGame\\asset.zip (請注意,反斜線需要針對 JSON 格式進行逸出)。StartGameCommand- 容器內遊戲伺服器可執行檔的完整路徑。例如,如果可執行檔的名稱為 mygame.exe,範例路徑會是 C:\\Assets\\mygame.exe。處理序和容器的 StartGameCommand 路徑不同。容器的 StartGameCommand 路徑是容器或資產資料夾中資源的絕對路徑。處理序的 StartGameCommand 路徑是相對路徑,其工作目錄將是指定的第一個資產。PortMappingsList- 這些是遊戲在執行時可用的連接埠。NodePort是在您的工作站上開啟的連接埠,GamePort.Number是您的遊戲伺服器在容器中執行時需要繫結的連接埠。更新 GamePort 區段,使其符合遊戲伺服器接聽用戶端的通訊協定和連接埠。如果您的遊戲伺服器需要多個連接埠,請複製/貼上現有的連接埠設定並遞增NodePort,然後將GamePort.Number和GamePort.Name更新為所需的連接埠。以處理序形式執行時,會忽略GamePort.Number,您的處理序應繫結至 NodePort。若要處理這兩種情況,請執行下列其中一項:- 將連接埠設定為相同的值
- 在執行階段檢查 GSDK 設定中索引鍵
GamePort.Name的值,它一律會傳回要繫結的正確連接埠。
-
MultiplayerSettings.json 檔案中還有其他您可能想要編輯的欄位:
ResourceLimits(選用) - 如果指定,docker 會限制 CPU/記憶體使用量。警告:如果您的伺服器超過允許的記憶體,它會被終止。只能在容器模式中指定 ResourceLimits。SessionCookie(選用) - 作為 RequestMultiplayerServer API 呼叫的一部分傳遞給遊戲伺服器的任何工作階段 Cookie。OutputFolder(選用) - 產生輸出和設定檔之磁碟機或資料夾的絕對路徑。由於遊戲伺服器將解壓縮至此路徑下,請確定有足夠的可用空間。如果未指定,則會使用代理程式資料夾。MountPath- 容器內要掛接資產的路徑。以處理序模式執行時不需要指定此欄位。我們建議使用範例值——C:\\Assets (請注意,反斜線需要針對 JSON 格式進行逸出)。AgentListeningPort- 指定代理程式為了與遊戲伺服器通訊而繫結的連接埠。任何開放的連接埠都可以使用,如果您有其他處理序繫結至 56001,則必須變更此值 (或終止其他處理序)。
驗證 GSDK 整合
- 在 MultiplayerSettings.json 檔案中,將
RunContainer設定為false。 - 在 Powershell 視窗中 (以系統管理員身分):
- 將工作目錄變更為解壓縮工具組的資料夾。
- 執行 LocalMultiplayerAgent.exe。此時,LocalMultiplayerAgent 會設定 http 接聽程式、解壓縮遊戲資產,並在個別的處理序中啟動遊戲伺服器。接著 LocalMultiplayerAgent 會等待與遊戲伺服器整合之 GSDK 的活動訊號。
- 如果 GSDK 整合正確,LocalMultiplayerAgent 會列印下列輸出:
CurrentGameState - Initializing(這是選擇性的,如果您的遊戲伺服器直接呼叫GSDK::ReadyForPlayers而未呼叫GSDK::Start,則可能不會顯示)CurrentGameState - StandingByCurrentGameState - ActiveCurrentGameState - Terminating
- 如果關閉回呼設定正確,您的遊戲伺服器會在狀態設定為終止後很快結束。請務必確認遊戲伺服器會結束,以避免在 PlayFab 平台上發生非正常關閉。
- LocalMultiplayerAgent 也應隨遊戲一起終止。
測試與遊戲的連線
當您的遊戲伺服器可執行檔正在執行,且 LocalMultiplayerAgent 列印CurrentGameState - Active 時,您就可以使用 IP 位址 127.0.0.1 和遊戲伺服器所接聽的 NodePort 連接埠連線至遊戲伺服器。
在 NumHeartBeatsForActivateResponse 次活動訊號後,LocalMultiplayerAgent 會要求遊戲伺服器從待命移至作用中。接著在 NumHeartBeatsForTerminateResponse 次活動訊號後,LocalMultiplayerAgent 會要求遊戲伺服器從作用中移至已終止。您可以更新 MultiplayerSettings.json 檔案中的值來調整此行為。
驗證容器化
如果您是容器領域的新手,可以在此處查看簡介。先決條件
設定
- 確定 Docker 已設定為使用 Windows 容器
- 在 Powershell 視窗中 (以系統管理員身分):
- 瀏覽至解壓縮工具組的資料夾。
- 執行 Setup.ps1,它會設定 docker 網路、新增防火牆規則以便與 LocalMultiplayerAgent 通訊,並從 Microsoft/PlayFab-Multiplayer 提取 PlayFab docker 映像。請注意,第一次執行指令碼時,可能需要幾分鐘的時間來下載容器映像。
若要成功執行此設定,您可能必須設定已安裝之任何第三方防毒程式 (例如 McAfee、Norton 或 Avira) 的防火牆。
在容器內執行遊戲伺服器
- 在 MultiplayerSettings.json 檔案中,將
RunContainer設定為true。 - 在解壓縮工具組的資料夾 (C:\PlayFabVmAgent) 中開啟 Powershell 視窗 (以系統管理員身分),然後執行
LocalMultiplayerAgent.exe。這會在容器內啟動遊戲伺服器。最後,您應該會在 Powershell 視窗中看到遊戲狀態變更的輸出 (就像上方驗證 GSDK 整合一節中一樣)。
測試與在容器內執行之遊戲伺服器的連線
當 LocalMultiplayerAgent 輸出列印CurrentGameState - Active 時,使用 IP 位址 127.0.0.1 和等於 MultiplayerSettings.json 檔案中所指定之 NodePort (預設為 56100) 的連接埠連線至遊戲伺服器。
在 NumHeartBeatsForActivateResponse 次活動訊號後,LocalMultiplayerAgent 會要求遊戲伺服器從待命移至作用中。接著在 NumHeartBeatsForTerminateResponse 次活動訊號後,LocalMultiplayerAgent 會要求遊戲伺服器從作用中移至已終止。您可以更新 MultiplayerSettings.json 檔案中的值來調整此行為。
搭配 Linux 容器使用 LocalMultiplayerAgent
您可以使用 Windows 版 Docker,在 Windows 的容器上執行您的 Linux 遊戲伺服器,以使用 LocalMultiplayerAgent 對其進行偵錯。您可以在此處查看有關在 Windows 上執行 Linux 容器的更多資訊。基本上,您只需使用 -lcow 參數執行代理程式,並正確設定 LocalMultiplayerSettings.json 檔案即可。 若要在 Windows 上執行容器化的 Linux 遊戲伺服器,您需要執行下列步驟:- 從 GitHub 上的 Releases 頁面下載最新版本的 LocalMultiplayerAgent
- 在 Windows 上安裝 Docker Desktop
- 確定它在 Linux 容器上執行
- 您應該掛接其中一個硬碟,可以在此處找到指示
- 您的遊戲伺服器映像可以發佈在容器登錄上,也可以在本機建置。
- 執行
SetupLinuxContainersOnWindows.ps1Powershell 檔案,它會建立名為 “PlayFab” 的 Docker 網路 - 正確設定 LocalMultiplayerSettings.json 檔案。您可以在下方看到
MultiplayerSettingsLinuxContainersOnWindowsSample.json中包含的範例:
一些注意事項:1. 您必須將
RunContainer 設定為 true。Linux 遊戲伺服器需要此設定。
- 使用您的遊戲伺服器 docker 映像詳細資料修改
imageDetails。映像可以在本機建置 (使用 docker build 命令),也可以裝載在遠端容器登錄中。
StartGameCommand 和 AssetDetails 是選擇性的。使用 Docker 容器時通常不會使用它們,因為所有遊戲資產和啟動遊戲伺服器命令都可以封裝在對應的 Dockerfile 中
- 最後但同樣重要的是,請注意您的
OutputFolder 變數的大小寫,因為 Linux 容器會區分大小寫。如果大小寫錯誤,您可能會看到類似以下的 Docker 例外狀況:error while creating mount source path ‘/host_mnt/c/output/UnityServerLinux/PlayFabVmAgentOutput/2020-01-30T12-47-09/GameLogs/a94cfbb5-95a4-480f-a4af-749c2d9cf04b’: mkdir /host_mnt/c/output: file exists
- 執行所有先前的步驟後,您就可以使用命令
LocalMultiplayerAgent.exe -lcow執行 LocalMultiPlayerAgent (lcow 代表 Linux Containers On Windows)
疑難排解
- 在容器模式中,如果您的遊戲伺服器立即結束並出現類似 “Container … exited with exit code 1” 的錯誤,但在處理序模式中運作正常,請確定您已在資產套件中包含所有必要的系統 DLL。
- 所有記錄都位於 MultiplayerSettings.json 檔案中指定的
OutputFolder下。LocalMultiplayerAgent 每次啟動時都會建立一個新資料夾,並以時間戳記作為資料夾名稱。透過 GSDK 發出的所有遊戲伺服器記錄都位於 GameLogs 資料夾中。
如果遊戲伺服器在容器中執行,可能需要多瀏覽一層目錄階層。 - GSDK 會將偵錯記錄寫入 GameLogs 資料夾。這些記錄與遊戲伺服器輸出的記錄一起位於 GameLogs 資料夾中。
- 確定防火牆 (Windows 和其他防毒軟體) 已設定為允許透過這些連接埠的流量。
- 如果您收到類似以下的錯誤:
Docker API responded with status code=InternalServerError, response={"message":"failed to create endpoint <container_name> on network playfab: hnsCall failed in Win32: The specified port already exists". It's likely there is already a container running on the specified port.如果 LocalMultiplayerAgent 過早結束,就可能發生這種情況。使用命令docker ps找出正在執行的容器,然後使用docker kill <container_name>將其終止。 - 如果您收到包含
Failed to find network 'playfab'的錯誤,請嘗試重新執行 Setup.ps1 - 如果您收到
Unhandled Exception錯誤,您可能正以系統管理員身分執行 PowerShell。 OutputFolder可能會被其他系統變數使用,因此請確定您使用的是絕對路徑。例如,GSDK_CONFIG_FILE 就有這樣的相依性,因此此處的相對路徑 (或不正確的值) 可能會導致遊戲伺服器設定載入錯誤。
已知限制
- 容器可能不會在偵錯結束時終止。如果發生這種情況,請以系統管理員身分執行下列 PowerShell 命令。這些命令會停止並移除所有容器,包括那些不是由 LocalMultiplayerAgent 啟動的容器。
