(轉載)(官網)UE4--Game Mode 和 Game State
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
AGameModeBase
的子類。由於其比賽狀態概念的實現,AGameMode
更適用於標準遊戲類型(如多人射擊遊戲)。AGameModeBase
簡潔高效,是新代碼項目中包含的全新默認遊戲模式。
AGameModeBase
所有 Game Mode 均為 AGameModeBase
的子類。而 AGameModeBase
包含大量可覆蓋的基礎功能。部分常見函數包括:
函數/事件 |
目的 |
---|---|
|
它在任意 Actor 運行
|
|
接受或拒絕嘗試加入服務器的玩家。如它將 |
|
成功登錄後調用。這是首個在 |
|
在 |
|
調用開始生成一個玩家 pawn。如需要指定 Pawn 生成的地點,還可使用 |
|
這實際生成玩家 Pawn,可在藍圖中覆蓋。 |
|
玩家離開遊戲或被摧毀時調用。可實現 |
可針對遊戲提供的每個比賽格式、任務類型或特殊區域創建 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
或 HasMatchStarted
、IsMatchInProgress
和 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
是基礎實現,其部分默認功能包括:
函數或變量 |
使用 |
---|---|
|
這是 |
|
這是所有 |
|
如 |
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