在学习虚幻引擎的基础知识时,你应该了解过虚幻引擎Gameplay框架的工作原理。 而在本文档中,我们将介绍如何为Parrot设置游戏模式和游戏状态类。
游戏模式
游戏模式负责定义游戏的基本规则,例如玩家数量或玩家加入游戏的方式。 它还为设置有用的游戏类提供了框架,这些类包括游戏状态、玩家控制器、HUD和默认的Pawn类等等。
要为Parrot设置游戏模式,请执行以下步骤:
转到 内容浏览器(Content Browser),点击 内容(Content) > 蓝图(Blueprints) > 游戏(Game)。
在内容浏览器中点击右键,然后点击蓝图类(Blueprint Class)。
将父类设为 AGameModeBase。
将该类命名为"BP_ParrotGameMode"。
双击新建的蓝图并查看其定义的核心类。 针对Parrot,你将需要更改部分类:
将 游戏状态类(Game State Class) 设为BP_ParrotGameState
将玩家控制器类(Player Controller Class)设为BP_ParrotPlayerController
将HUD类(HUD Class)设为BP_ParrotHUD
将默认Pawn类(Default Pawn Class)设为BP_ParrotPlayerCharacter
转到编辑(Edit) > 项目设置(Project Settings) > 地图和模式(Maps & Modes),将默认游戏模式(Default GameMode)设为BP_ParrotGameMode。
设置好游戏模式后,你就可以设置游戏状态了。
游戏状态
游戏状态负责处理当前游戏中发生的事情。 它会管理客户端需要知晓的信息,但这些信息并不与任何特定的玩家绑定。 例如,你可以用游戏状态存储团队得分。
要为Parrot创建游戏状态,请执行以下步骤:
在主编辑器中选择 "工具(Tool) > 新建C++类...(New C++ Class...)"
将父类设为AGameStateBase。
将该类命名为"AParrotGameState"。
转到内容浏览器,点击+添加(+ Add) > 蓝图类(Blueprint Class)。
将父类设为AParrotGameState。
将该类命名为"BP_ParrotGameState"。
转到你的游戏模式蓝图,将游戏状态字段的值设为 BP_ParrotGameState。
游戏模式和游戏状态概念回顾
如需详细了解游戏模式和游戏状态,请参阅游戏模式和游戏状态一文。 当你随着开发过程不断创建新的类时,请记得更新游戏模式和游戏状态。
你也可以逐地图设置游戏模式。 Parrot主菜单所使用的游戏模式就与游戏内关卡所使用的不同。
游戏实例
游戏实例是引擎中处理项目专属功能的单个持久类实例。 它在应用程序的整个生命周期中都存在。 它包含了游戏的视口客户端和本地玩家。
与处理游戏模式和状态的模式相同,我们会创建一个基础C++ 类(即UParrotGameInstance)以及一个蓝图类(即BP_ParrotGameInstance)。 要为项目设置游戏实例类,请转到"编辑(Edit) -> 项目设置(Project Settings) -> 地图和模式(Maps & Modes)"
要为Parrot创建游戏实例,请执行以下步骤:
在主编辑器中选择 "工具(Tool) > 新建C++类...(New C++ Class...)"
将父类设为UGameInstance。
将该类命名为"UParrotGameInstance"。
转到内容浏览器,点击+添加(+ Add) > 蓝图类(Blueprint Class)。
将父类设为UParrotGameInstance。
将该类命名为"BP_ParrotGameInstance"。
转到 编辑(Edit) > 项目设置(Project Settings) > 地图和模式(Maps & Modes),将 游戏实例类(Game Instance Class)设为 BP_ParrotGameInstance。
关卡流送示例
在Parrot中,不同的地图专属于不同的游戏模式,游戏实例会用UParrotMapDataAsset文件向游戏表明应该加载哪张地图。 这些数据资产包含了指向地图文件的软对象指针。 这些资产依靠游戏实例组织,并可随着玩家推进游戏进程而循环使用。 由于这些资产都依靠游戏实例,因此你可以从任何地方将下一关卡流送进来。 玩家控制器会监听游戏状态的变化,然后按需调用游戏实例。
下方截图所示的蓝图会使用流送关卡(Stream Level)节点和异步加载资产(Async Load Asset)节点异步加载ParrotMapDataAsset的软对象引用。 这时,由于关卡已被加载,因此无需等待同步加载即可调用打开关卡(Open Level)节点。 这里还使用了CommonLoadingScreen插件。 该加载界面控件会在预加载下一张地图时被调用,并在加载后被移除。
如需详细了解加载界面以及Parrot在此使用异步加载而不是同步加载的原因,请参阅Parrot的用户界面文档。