成员变量分析
OnGameModePlayerInitialized- 声明位置:
.h文件,public区域。 - 类型:
FOnLyraGameModePlayerInitialized(一个多播委托) - 分析: 这是一个事件委托,当玩家(或机器人)控制器完成初始化后会被广播。它传递两个参数:当前的游戏模式实例 (
AGameModeBase*) 和初始化完成的控制器 (AController*)。 - 在 LyraStarterGame 中的应用:
- 系统集成: 这是 Lyra 游戏框架中的一个重要扩展点。其他游戏系统(如UI、技能、装备等)可以监听这个委托,以便在玩家完全准备好之后执行自己的初始化逻辑。
- 示例: 当一个新的玩家加入游戏或旅行后,HUD 系统可以监听此委托来创建玩家特定的UI元素。成就系统可以监听它来检查初始成就。这确保了这些系统只在玩家控制器有效且就绪后运行,避免了空指针或初始化顺序问题。
- 声明位置:
成员函数分析
构造函数 ALyraGameMode
- 定义位置:
.cpp文件。 - 分析: 在构造函数中,设置了游戏模式所使用的一系列默认类。这些类都是 Lyra 自定义的类,替换了引擎的默认类。
- 在 LyraStarterGame 中的应用:
- 这是 Lyra 游戏框架的基石。它确保了游戏运行时使用的是 Lyra 特有的
GameState,PlayerController,PlayerState,Character等。例如,ALyraCharacter包含了 Lyra 所需的技能系统、移动组件等,而ALyraPlayerState则负责管理玩家的经验、等级、统计信息等。
- 这是 Lyra 游戏框架的基石。它确保了游戏运行时使用的是 Lyra 特有的
GetPawnDataForController
- 定义位置:
.cpp文件。 - 分析: 此函数负责为一个给定的控制器决定使用哪个
ULyraPawnData资产。ULyraPawnData是一个数据资产,定义了 Pawn 的类、输入配置、相机模式、属性集等重要信息。 - 在 LyraStarterGame 中的应用:
- 英雄定义: 这是实现“英雄”(即玩家可操控角色)系统的核心。不同的英雄(如机枪兵、刺客)对应不同的
PawnData。 - 获取流程:
- 首先检查控制器的
PlayerState是否已经设置了PawnData(这通常用于实现英雄选择功能)。 - 如果未设置,则回退到当前加载的
LyraExperienceDefinition(游戏体验)中定义的默认PawnData。 - 如果体验也未定义,则最终回退到资源管理器中的全局默认
PawnData。
- 首先检查控制器的
- 这种层级结构使得游戏可以灵活地为不同模式(如 PVP、PVE)设置不同的默认英雄,同时支持玩家在游戏中自定义选择。
- 英雄定义: 这是实现“英雄”(即玩家可操控角色)系统的核心。不同的英雄(如机枪兵、刺客)对应不同的
InitGame
- 定义位置:
.cpp文件。 - 分析: 重写了引擎的
InitGame函数。在调用父类实现后,它设置了一个定时器,在下一帧执行HandleMatchAssignmentIfNotExpectingOne。 - 在 LyraStarterGame 中的应用:
- 异步初始化: 这是一种常见的模式,将复杂的初始化流程(如确定游戏体验)推迟到下一帧,确保游戏世界的基本框架已经建立完成,避免在初始化过程中出现不可预知的问题。
HandleMatchAssignmentIfNotExpectingOne
- 定义位置:
.cpp文件。 - 分析: 这是决定当前游戏会话应该使用哪个“游戏体验”(
LyraExperienceDefinition)的核心逻辑。它按照一个明确的优先级顺序来查找ExperienceId。 - 在 LyraStarterGame 中的应用:
- 体验优先级系统: 这个优先级系统为游戏开发和运营提供了极大的灵活性:
- 最高优先级 - URL 选项: 允许通过命令行或URL参数(如
?Experience=BP_MyExperience)强制指定体验,常用于开发和测试特定模式。 - PIE 覆盖 - 开发者设置: 在编辑器 Play-in-Editor 模式下,可以使用项目设置中指定的体验进行快速迭代。
- 命令行: 在打包版本中也可以通过命令行启动指定体验。
- 世界设置: 可以为每个地图指定一个默认的体验。
- 专用服务器: 如果没有指定,则尝试作为专用服务器启动。
- 最终回退 - 硬编码默认值: 如果所有方式都失败,则使用代码中指定的默认体验(
B_LyraDefaultExperience)。
- 最高优先级 - URL 选项: 允许通过命令行或URL参数(如
- 最终,找到的
ExperienceId会传递给OnMatchAssignmentGiven。
- 体验优先级系统: 这个优先级系统为游戏开发和运营提供了极大的灵活性:
OnMatchAssignmentGiven
- 定义位置:
.cpp文件。 - 分析: 接收确定的
ExperienceId,并通过GameState上的ULyraExperienceManagerComponent来设置和加载该体验。 - 在 LyraStarterGame 中的应用:
- 这是启动游戏体验加载流程的触发器。
ULyraExperienceManagerComponent会异步加载指定的LyraExperienceDefinition资产,该资产包含了游戏所需的所有资源(如PawnData,UI,GameplayCues,AI等)的引用。
- 这是启动游戏体验加载流程的触发器。
OnExperienceLoaded
- 定义位置:
.cpp文件。 - 分析: 这是一个回调函数,在
ULyraExperienceManagerComponent完成体验加载后被调用。 - 在 LyraStarterGame 中的应用:
- 玩家生成信号: 一旦体验加载完成,就意味着游戏运行所需的所有数据和系统都已就绪。此时,函数会遍历所有已经登录但还没有 Pawn 的玩家控制器,并调用
RestartPlayer来生成他们的角色。 - 无缝衔接: 这确保了玩家不会在资源加载完成前被生成到一个不完整的世界中,避免了各种加载相关问题。
- 玩家生成信号: 一旦体验加载完成,就意味着游戏运行所需的所有数据和系统都已就绪。此时,函数会遍历所有已经登录但还没有 Pawn 的玩家控制器,并调用
GetDefaultPawnClassForController_Implementation
- 定义位置:
.cpp文件。 - 分析: 重写了引擎的虚函数,用于为特定控制器提供要生成的 Pawn 类。
- 在 LyraStarterGame 中的应用:
- 它不再硬编码一个 Pawn 类,而是通过
GetPawnDataForController查询到对应的ULyraPawnData,然后返回该数据资产中定义的PawnClass。这使得每个英雄都可以拥有自己独特的角色类。
- 它不再硬编码一个 Pawn 类,而是通过
SpawnDefaultPawnAtTransform_Implementation
- 定义位置:
.cpp文件。 - 分析: 重写了引擎的虚函数,用于在指定位置生成 Pawn。
- 在 LyraStarterGame 中的应用:
- 在生成 Pawn 的基础上,增加了 Lyra 特有的逻辑:它查找生成的 Pawn 身上的
ULyraPawnExtensionComponent,并将从GetPawnDataForController获取到的PawnData设置给它。 - 数据驱动: 这个步骤至关重要,它将定义英雄行为的数据资产注入到实际的 Pawn 实体中,后续的系统(如输入、能力、相机)都可以从这个组件读取配置信息。
- 在生成 Pawn 的基础上,增加了 Lyra 特有的逻辑:它查找生成的 Pawn 身上的
ShouldSpawnAtStartSpot
- 定义位置:
.cpp文件。 - 分析: 重写此函数并始终返回
false。 - 在 LyraStarterGame 中的应用:
- 这明确告知引擎不要使用其内置的、简单的玩家起始点分配逻辑。Lyra 使用更复杂、更智能的
ULyraPlayerSpawningManagerComponent来处理生成逻辑,该组件可以支持团队生成区、重生点占领等高级功能。
- 这明确告知引擎不要使用其内置的、简单的玩家起始点分配逻辑。Lyra 使用更复杂、更智能的
ChoosePlayerStart_Implementation 和 FinishRestartPlayer
- 定义位置:
.cpp文件。 - 分析: 这两个函数都将具体的生成和重生逻辑委托给了
GameState上的ULyraPlayerSpawningManagerComponent。 - 在 LyraStarterGame 中的应用:
- 职责分离: 将生成策略从
GameMode中分离出来,使得生成逻辑可以独立于游戏模式进行扩展和修改。ULyraPlayerSpawningManagerComponent可以根据游戏规则(如团队、存活状态等)智能地选择最佳的重生点。
- 职责分离: 将生成策略从
PlayerCanRestart_Implementation 和 ControllerCanRestart
- 定义位置:
.cpp文件。 - 分析: 这两个函数用于判断一个控制器(玩家或AI)是否可以被重启(重生)。
- 在 LyraStarterGame 中的应用:
- 它们首先执行引擎的基本检查(如控制器是否有效),然后将决策权交给
ULyraPlayerSpawningManagerComponent。 - 高级控制: 生成管理组件可以基于更复杂的游戏状态来阻止重生,例如:玩家处于观察者模式、游戏回合已结束、或者在重生冷却时间内。
- 它们首先执行引擎的基本检查(如控制器是否有效),然后将决策权交给
InitGameState
- 定义位置:
.cpp文件。 - 分析: 重写此函数,在调用父类后,它找到
GameState上的ULyraExperienceManagerComponent并注册OnExperienceLoaded回调。 - 在 LyraStarterGame 中的应用:
- 确保游戏模式能够监听“游戏体验”加载完成的事件,这是启动玩家生成流程的关键钩子。
GenericPlayerInitialization
- 定义位置:
.cpp文件。 - 分析: 重写此函数,在调用父类后,广播
OnGameModePlayerInitialized委托。 - 在 LyraStarterGame 中的应用:
- 如前所述,这是通知其他游戏系统“一个新玩家已准备就绪”的标准机制。
RequestPlayerRestartNextFrame
- 定义位置:
.cpp文件。 - 分析: 一个工具函数,用于在下一帧安全地重启一个控制器(玩家或AI)。
- 在 LyraStarterGame 中的应用:
- 延迟执行: 用于处理在当前帧立即重启可能有问题的情况,例如在角色死亡并播放动画时,通常会在动画结束后才调用此函数来重生。
- 统一接口: 为玩家和AI机器人提供了一个统一的重生请求接口。
UpdatePlayerStartSpot
- 定义位置:
.cpp文件。 - 分析: 重写此函数,它简单地返回
true而不做任何操作。 - 在 LyraStarterGame 中的应用:
- 这与
ShouldSpawnAtStartSpot返回false的逻辑一致。Lyra 推迟了所有生成相关的决策,直到PostLogin和体验加载完成后,由自定义的生成管理器来处理,因此在这里不需要引擎的默认行为。
- 这与
FailedToRestartPlayer
- 定义位置:
.cpp文件。 - 分析: 重写此函数,当玩家重启失败时,它会尝试在下一帧再次重启。
- 在 LyraStarterGame 中的应用:
- 容错机制: 提供了一种鲁棒的重生机制。如果因为某些临时性问题(如生成点被阻塞、网络延迟)导致第一次生成失败,系统会自动重试,改善了玩家的游戏体验。同时,它也包含终止条件,如果确定玩家已无法重生(如
PawnClass为空),则停止重试。
- 容错机制: 提供了一种鲁棒的重生机制。如果因为某些临时性问题(如生成点被阻塞、网络延迟)导致第一次生成失败,系统会自动重试,改善了玩家的游戏体验。同时,它也包含终止条件,如果确定玩家已无法重生(如
TryDedicatedServerLogin, HostDedicatedServerMatch, OnUserInitializedForDedicatedServer
- 定义位置:
.cpp文件。 - 分析: 这一系列函数处理了作为专用服务器启动时的逻辑。
- 在 LyraStarterGame 中的应用:
- 专用服务器支持: 当游戏在专用服务器模式下启动时,它会尝试进行在线服务登录(如果需要),然后在登录成功或确定不需要登录后,调用
HostDedicatedServerMatch。 - 会话管理:
HostDedicatedServerMatch会读取命令行参数(如UserExperience或Playlist)来确定要托管的游戏会话(如特定的地图循环或模式),然后通过CommonSessionSubsystem来实际创建并托管一个在线会话,引导服务器进入正确的地图。
- 专用服务器支持: 当游戏在专用服务器模式下启动时,它会尝试进行在线服务登录(如果需要),然后在登录成功或确定不需要登录后,调用
总结
ALyraGameMode 是 LyraStarterGame 项目的游戏规则和流程控制中枢。它通过一个高度可配置、数据驱动的“游戏体验”系统来管理游戏内容,并通过委托和组件将具体职责(如生成、经验管理)分发给其他专门系统。这种模块化、事件驱动的设计使得 Lyra 框架非常灵活,能够轻松支持从死亡竞赛到复杂合作 PVE 等多种游戏模式,同时为在线服务、专用服务器和复杂的英雄系统提供了坚实的基础。
592

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



