该篇学习一些简单的额外知识可用作知识储备,会进行不定时更新
目录
Actor生命周期

- 将所有的Actor复制到一个新的场景中,后调用 PostDuplicate 代表复制完成。最后调用 InitializeActorsForPlay 来进行Actor的初始化操作(接口等)
- 将磁盘中的资源读到内存中,完成后调用 PostLoad (该接口可重写)。最后调用InitializeActorsForPlay 来进行Actor的初始化操作
- 在加载对象后立即执行所需的任何特定于对象的清理。这不会被新创建的对象调用,默认情况下总是在游戏线程上执行
- 准备播放Actor——各个组件的初始化:预初始化-初始化-Post初始化
- PreInitialize Components:预初始化。初始化一些准备工作,例如配表
- InitializeComponents:初始化。例如 注册、序列化
- PosInitializeComponents:Pos初始化。初始化结束
- BeginPlay:调用所有的 BeginPlay——开始GamePlay的逻辑
- SpawnActor:均使用World生成,当World销毁Actor也会销毁。当生成的Actor中有需要渲染的组件将可以被渲染出来
- PostSpawnInitiate:初始化结束,可自定义
- ExecuteConstruction:执行构造。例如组件的创建
- PostActorConstruction:构造完成。可自定义
- 进行初始化:预初始化-初始化-Post初始化
左边是Class直接进行反序列化即可。Class中记录角色具体信息,Spawn是划一片内存将Class的信息塞到Spawn(对象)中
- 执行BeginPlay→执行Tick
- Actor的删除模式最终汇总到EndPlay
- 将所有删除的角色标记为 RF_PendingKill
- 如果希望删除也可直接将Actor标记为RF_PendingKill,GC在下一次释放
- 保证没有关联后进行移除(World)
- 最后进行删除工作调用 BeginDestroy
- BeginDestroy
- IsReadyForFinishDestroy
- FinishDestroy:可重写
附上生命周期官方文档 Actor生命周期
设置游戏模式
定义游戏的一组规则。这些规则包括游戏启动时玩家将生成的默认Pawn。你需要设置这些规则才能生成你已创建的玩家角色。
Game Mode 和 Game State
游戏中的基础规则构成了 GameMode。在最基础的层面上,规则包括
- 出现的玩家和观众数量,以及允许的玩家和观众最大数量
- 玩家进入游戏的方式,可包含选择生成地点和其他生成/重生行为的规则
- 游戏是否可以暂停,以及如何处理游戏暂停
- 关卡之间的过渡,包括游戏是否以动画模式开场
当游戏中发生与规则相关的事件并需要与所有玩家进行追踪和分享时,这些信息便会通过Game State 进行存储和同步。这些信息包括
- 游戏已运行的时间(包括本地玩家加入前的运行时间)
- 每个个体玩家加入游戏的时间和玩家的当前状态
- 当前 Game Mode 的基类
- 游戏是否已开始
Game Mode
虽然某些基本原则(如进行游戏所需要的玩家数量,或玩家加入游戏的方法)在许多类型的游戏中都很常见,但根据你所开发的特定游戏,可能存在无限个变化。不管这些规则是什么,Game Modes 都是用来定义和执行这些规则的。目前有两个常用的游戏模式基类。
AGameModeBase
所有 Game Mode 均为 AGameModeBase 的子类。而 AGameModeBase 包含大量可覆盖的基础功能。部分常见函数包括
| 函数/事件(Function/Event) | 目的(Purpose) |
| InitGame |
|
| PreLogin | 接受或拒绝试图加入服务器的玩家。如果将ErrorMessage设置为非空字符串,则导致Login函数失败。PreLogin在Login之前被调用,并且在Login被调用之前可能会经过很长一段时间,特别是当加入玩家需要下载游戏内容时 |
| PostLogin | 成功登录后调用。这是第一个可以安全地在PlayerController上调用复制函数的地方。OnPostLogin可以在Blueprint中实现,以添加额外的逻辑 |
| HandleStartingNewPlayer | 在 PostLogin 后或无缝游历后调用,可在蓝图中覆盖,修改新玩家身上发生的事件。它将默认创建一个玩家 pawn。 |
| RestartPlayer | 调用开始生成一个玩家 pawn。如需要指定 Pawn 生成的地点,还可使用 RestartPlayerAtPlayerStart 和 RestartPlayerAtTransform 函数。OnRestartPlayer 可在蓝图中实现,在此函数完成后添加逻辑。 |
| SpawnDefaultPawnAtTransform | 这实际生成玩家 Pawn,可在蓝图中覆盖 |
| Logout | 玩家离开游戏或被摧毁时调用。可实现 OnLogout 执行蓝图逻辑 |
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
- 设置
DefaultEngine.ini文件的/Script/EngineSettings.GameMapsSettings部分的GlobalDefaultGameMode输入将设置项目中所有地图的默认游戏模式 - 在编辑器中 World Settings 标签下设置 GameMode Override 即可覆盖个体地图的项目设置
- URL 可被传到可执行文件,强制游戏加载时带特定选项。使用
game选项设置游戏模式。查看 命令行参数中的详细内容 - 可在
DefaultEngine.ini文件的/Script/Engine.WorldSettings/部分中设置地图前缀(和 URL 法的别名)。这些前缀设置所有拥有特定前缀的地图的默认游戏模式 - 请查阅 设置 Game Mode 文档中设置 Game Mode 的范例。但是蓝图版本,具体等后边进项目的时候再具体学习了。
Game State
Game State 负责启用客户端监控游戏状态。从概念上而言,Game State 应该管理所有已连接客户端已知的信息(特定于 Game Mode 但不特定于任何个体玩家)。它能够追踪游戏层面的属性,如已连接玩家的列表、夺旗游戏中的团队得分、开放世界游戏中已完成的任务,等等
Game State 并非追踪玩家特有内容(如夺旗比赛中特定玩家为团队获得的分数)的最佳之处,因为它们由 Player State 更清晰地处理。整体而言,GameState 应该追踪游戏进程中变化的属性。这些属性与所有人皆相关,且所有人可见。Game mode 只存在于服务器上,而 Game State 存在于服务器上且会被复制到所有客户端,保持所有已连接机器的游戏进程更新
| 函数或变量(Function or Variable) | 使用(Use) |
| GetServerWorldTimeSeconds | 这是 UWorld 函数 GetTimeSeconds 的服务器版本,将在客户端和服务器上同步,因此它是用于复制的可靠时间。 |
| PlayerArray | 这是所有 APlayerState 对象的阵列,对游戏中所有玩家执行操作时十分实用 |
| HasBegunPlay | 如果在游戏中的角色上调用了BeginPlay函数,则返回true。 |
AGameStateBase 通常在 C++ 或蓝图中延展,包含用于使游戏中玩家知晓当前情况的额外变量和函数。进行的特定修改通常基于 Game State 的配对 Game Mode。Game Mode 自身也可将其默认 Game State 类覆盖为派生自 AGameStateBase 的任意 C++ 类或蓝图。
GamePlay框架快速参考
用户界面(User Interfaces)和HUD
HUD指的是游戏期间在屏幕上覆盖的状态和信息。HUD的目的是 告知玩家当前游戏状态,即分数、生命值、游戏剩余时间等。 HUD通常是不可互动的,意味着玩家不能单击HUD的元素,因此 在HUD和用户界面难以分离的某些类型游戏中,这些元素会显示为灰色区域
用户界面 指的是菜单和其他互动元素。这些元素通常是在屏幕上覆盖绘制的, 就像HUD一样,但在某些情况下,它们会成为游戏世界本身的一部分, 在场景中的一个表面上渲染出来。最明显的UI示例是游戏启动时显示的主菜单, 或玩家暂停游戏时显示的暂停菜单。但是,游戏期间可能会显示其他UI。这些 可以用于显示游戏中不同角色之间的对话,或在更复杂的情况下,如RTS或RPG, 它们可能成为游戏本身不可或缺的一部分,让玩家可以选择武器、盔甲、建筑单位等等。

本文是Unreal Engine 5官方文档的学习笔记,涵盖Actor生命周期、游戏模式设置、GamePlay框架、开发者文件夹与源码管理等内容。详细介绍了Actor的初始化、删除过程,游戏模式和游戏状态的规则与功能,以及用户界面、关卡管理、资产处理等方面的知识。
最低0.47元/天 解锁文章
2184

被折叠的 条评论
为什么被折叠?



