1. 程式人生 > >(轉載)(官網)UE4--Game Mode 和 Game State

(轉載)(官網)UE4--Game Mode 和 Game State

per eid container ppr nta 常見 form 暫停 信息

Game Mode 和 Game State

本頁面的內容:
  • Game Modes
  • Game State

兩個主要類負責處理進行中遊戲的相關信息:Game Mode Game State

即使最開放的遊戲也擁有基礎規則,而這些規則構成了 Game Mode。在最基礎的層面上,這些規則包括:

  • 出現的玩家和觀眾數量,以及允許的玩家和觀眾最大數量。

  • 玩家進入遊戲的方式,可包含選擇生成地點和其他生成/重生成行為的規則。

  • 遊戲是否可以暫停,以及如何處理遊戲暫停。

  • 關卡之間的過渡,包括遊戲是否以動畫模式開場。

基於規則的事件在遊戲中發生,需要進行追蹤並和所有玩家共享時,信息將通過 Game State

進行存儲和同步。這些信息包括:

  • 遊戲已運行的時間(包括本地玩家加入前的運行時間)。

  • 每個個體玩家加入遊戲的時間和玩家的當前狀態。

  • 當前 Game Mode 的基類。

  • 遊戲是否已開始。

Game Modes

特定的基礎(如進行遊戲所需要的玩家數量,或玩家加入遊戲的方法)在多種類型的遊戲中具有共通性。可根據開發的特定遊戲進行無窮無盡的規則變化。無論規則如何,Game Modes 的任務都是定義和實現規則。Game Modes 當前常用的基類有兩個。

4.14 版本中加入了 AGameModeBase,這是所有 Game Mode 的基類,是經典的 AGameMode 簡化版本。AGameMode

是 4.14 版本之前的基類,仍然保留,功能 如舊,但現在是 AGameModeBase的子類。由於其比賽狀態概念的實現,AGameMode 更適用於標準遊戲類型(如多人射擊遊戲)。AGameModeBase 簡潔高效,是新代碼項目中包含的全新默認遊戲模式。

AGameModeBase

所有 Game Mode 均為 AGameModeBase 的子類。而 AGameModeBase 包含大量可覆蓋的基礎功能。部分常見函數包括:

函數/事件

目的

InitGame

InitGame 事件在其他腳本之前調用(包括 PreInitializeComponents),由 AGameModeBase

使用,初始化參數並生成其助手類。

它在任意 Actor 運行 PreInitializeComponents 前調用(包括 Game Mode 實例自身)。

PreLogin

接受或拒絕嘗試加入服務器的玩家。如它將 ErrorMessage 設為一個非空字符串,會導致 Login 函數失敗。PreLogin Login 前調用,Login 調用前可能需要大量時間,加入的玩家需要下載遊戲內容時尤其如此。

PostLogin

成功登錄後調用。這是首個在 PlayerController 上安全調用復制函數之處。OnPostLogin 可在藍圖中實現,以添加額外的邏輯。

HandleStartingNewPlayer

PostLogin 後或無縫遊歷後調用,可在藍圖中覆蓋,修改新玩家身上發生的事件。它將默認創建一個玩家 pawn。

RestartPlayer

調用開始生成一個玩家 pawn。如需要指定 Pawn 生成的地點,還可使用 RestartPlayerAtPlayerStart RestartPlayerAtTransform 函數。OnRestartPlayer可在藍圖中實現,在此函數完成後添加邏輯。

SpawnDefaultPawnAtTransform

這實際生成玩家 Pawn,可在藍圖中覆蓋。

Logout

玩家離開遊戲或被摧毀時調用。可實現 OnLogout 執行藍圖邏輯。

可針對遊戲提供的每個比賽格式、任務類型或特殊區域創建 AGameModeBase 的子類。一款遊戲可擁有任意數量的 Game Mode,因此也可擁有任意數量的 AGameModeBase 類子類;然而,給定時間上只能使用一個 Game Mode。每次關卡進行遊戲實例化時 Game Mode Actor 將通過 UGameEngine::LoadMap() 函數進行實例化。

Game Mode 不會復制到加入多人遊戲的遠程客戶端;它只存在於服務器上,因此本地客戶端可看到之前使用過的留存 Game Mode 類(或藍圖);但無法訪問實際的實例並檢查其變量,確定遊戲進程中已發生哪些變化。如玩家確實需要更新與當前 Game Mode 相關的信息,可將信息保存在一個 AGameStateBase Actor 上,輕松保持同步。AGameStateBase Actor 隨 Game Mode 而創建,之後被復制到所有遠程客戶端。

AGameMode

AGameMode AGameModeBase 的子類,擁有一些額外的功能支持多人遊戲和舊行為。所有新建項目默認使用 AGameModeBase。如果需要此額外行為,可切換到從 AGameMode 進行繼承。如從 AGameMode 進行繼承,也可從 AGameState 繼承遊戲狀態(其支持比賽狀態機)。

AGameMode 包含一個跟蹤比賽狀態或整體遊戲流程的狀態機。可使用 GetMatchState HasMatchStartedIsMatchInProgress HasMatchEnded 之類的封裝器查詢當前的狀態。以下是可能的比賽狀態:

  • EnteringMap 是初始狀態。Actor 尚未進行 tick,世界場景尚未完整初始化。內容完整加載後將過渡到下個狀態。

  • WaitingToStart 是下個狀態,進入時將調用 HandleMatchIsWaitingToStart。Actor 正在進行 tick,但玩家尚未生成。如 ReadyToStartMatch 返回 true StartMatch 被調用,它將過渡到下個狀態。

  • InProgress 是遊戲主體所發生的狀態。進入此狀態時將調用 HandleMatchHasStarted,然後在所有 Actor 上調用 BeginPlay。此時,正常遊戲進程已在進行中。ReadyToEndMatch 返回 true 或調用 EndMatch 時比賽將過渡到下個狀態。

  • WaitingPostMatch 是倒數第二個狀態,進入時將調用 HandleMatchHasEnded。Actor 仍在 tick,但新玩家無法加入。地圖轉換開始時它將過渡到下個狀態。

  • LeavingMap 是正常流程中的最後一個狀態,進入時將調用 HandleLeavingMap。轉換到新地圖時比賽將保持在此狀態中,進入新地圖時將過渡回到 EnteringMap

  • Aborted 是失敗狀態,調用 AbortMatch 可開始此狀態。出現無法恢復的錯誤時將進行此設置。

遊戲狀態將固定為 InProgress,因為這是調用 BeginPlay、actor 開始 tick 的狀態。然而,個體遊戲可能覆蓋這些狀態的行為,用更復雜的規則構建一個多人遊戲,如在一款多人射擊遊戲中等待其他玩家加入時允許玩家在關卡中自由飛行。

Game Mode 藍圖

可創建派生自 Game Mode 類的藍圖,並將它們用作項目或關卡的默認 Game Mode。

派生自 Game Mode 的藍圖可進行以下默認設置:

  • 默認 Pawn

  • HUD 類

  • PlayerController(玩家控制器)

  • Spectator 類

  • Game State 類

  • Player State 類

此外,Game Mode 的藍圖十分實用,因為它們無需調整代碼即可啟用變量調整。因此可用於使單一 Game Mode 適用到多個不同關卡,無需使用硬編碼資源引用或為每次調整請求工程支持和代碼修改。

設置 Game Mode

設置關卡的 Game Mode 有多種,此處的排序從優先級最低到最高:

  • 設置 DefaultEngine.ini 文件的 /Script/EngineSettings.GameMapsSettings 部分的 GlobalDefaultGameMode 輸入將設置項目中所有地圖的默認遊戲模式。

    [/Script/EngineSettings.GameMapsSettings]
    GlobalDefaultGameMode="/Script/MyGame.MyGameGameMode"
    GlobalDefaultServerGameMode="/Script/MyGame.MyGameGameMode"
  • 在編輯器中 World Settings 標簽下設置 GameMode Override 即可覆蓋個體地圖的項目設置。

    技術分享圖片

  • URL 可被傳到可執行文件,強制遊戲加載時帶特定選項。使用 game 選項設置遊戲模式。查看 命令行參數 中的詳細內容。

    UE4Editor.exe /Game/Maps/MyMap?game=MyGameMode -game
  • 最後,可在 DefaultEngine.ini 文件的 /Script/Engine.WorldSettings/ 部分中設置地圖前綴(和 URL 法的別名)。這些前綴設置所有擁有特定前綴的地圖的默認遊戲模式。

    [/Script/EngineSettings.GameMapsSettings]
    +GameModeMapPrefixes=(Name="DM",GameMode="/Script/UnrealTournament.UTDMGameMode")
    +GameModeClassAliases=(Name="DM",GameMode="/Script/UnrealTournament.UTDMGameMode")

請查閱 [設置 Game Mode] 文檔中設置 Game Mode 的範例。

Game State

Game State 負責啟用客戶端監控遊戲狀態。從概念上而言,Game State 應該管理所有已連接客戶端已知的信息(特定於 Game Mode 但不特定於任何個體玩家)。它能夠追蹤遊戲層面的屬性,如已連接玩家的列表、奪旗遊戲中的團隊得分、開放世界遊戲中已完成的任務,等等。

Game State 並非追蹤玩家特有內容(如奪旗比賽中特定玩家為團隊獲得的分數)的最佳之處,因為它們由 Player State 更清晰地處理。整體而言,GameState 應該追蹤遊戲進程中變化的屬性。這些屬性與所有人皆相關,且所有人可見。Game mode 只存在於服務器上,而 Game State 存在於服務器上且會被復制到所有客戶端,保持所有已連接機器的遊戲進程更新。

AGameStateBase 是基礎實現,其部分默認功能包括:

函數或變量

使用

GetServerWorldTimeSeconds

這是 UWorld 函數 GetTimeSeconds 的服務器版本,將在客戶端和服務器上同步,因此該時間可用於復制,十分可靠。

PlayerArray

這是所有 APlayerState 對象的陣列,對遊戲中所有玩家執行操作時十分實用。

HasBegunPlay

BeginPlay 函數在遊戲中的 actor 上調用,則返回 true。

AGameStateBase 通常在 C++ 或藍圖中延展,包含用於使遊戲中玩家知曉當前情況的額外變量和函數。進行的特定修改通常基於 Game State 的配對 Game Mode。Game Mode 自身也可將其默認 Game State 類覆蓋為派生自 AGameStateBase 的任意 C++ 類或藍圖。

技術分享圖片

相關頁面

  • PlayerController(玩家控制器)

原文地址:https://docs.unrealengine.com/latest/CHN/Gameplay/Framework/GameMode/index.html#gamestate

(轉載)(官網)UE4--Game Mode 和 Game State