Lyra学习003:LyraGameMode 分析

成员变量分析

  1. OnGameModePlayerInitialized
    • 声明位置: .h 文件,public 区域。
    • 类型: FOnLyraGameModePlayerInitialized (一个多播委托)
    • 分析: 这是一个事件委托,当玩家(或机器人)控制器完成初始化后会被广播。它传递两个参数:当前的游戏模式实例 (AGameModeBase*) 和初始化完成的控制器 (AController*)。
    • 在 LyraStarterGame 中的应用:
      • 系统集成: 这是 Lyra 游戏框架中的一个重要扩展点。其他游戏系统(如UI、技能、装备等)可以监听这个委托,以便在玩家完全准备好之后执行自己的初始化逻辑。
      • 示例: 当一个新的玩家加入游戏或旅行后,HUD 系统可以监听此委托来创建玩家特定的UI元素。成就系统可以监听它来检查初始成就。这确保了这些系统只在玩家控制器有效且就绪后运行,避免了空指针或初始化顺序问题。

成员函数分析

构造函数 ALyraGameMode
  • 定义位置: .cpp 文件。
  • 分析: 在构造函数中,设置了游戏模式所使用的一系列默认类。这些类都是 Lyra 自定义的类,替换了引擎的默认类。
  • 在 LyraStarterGame 中的应用:
    • 这是 Lyra 游戏框架的基石。它确保了游戏运行时使用的是 Lyra 特有的 GameState, PlayerController, PlayerState, Character 等。例如,ALyraCharacter 包含了 Lyra 所需的技能系统、移动组件等,而 ALyraPlayerState 则负责管理玩家的经验、等级、统计信息等。
GetPawnDataForController
  • 定义位置: .cpp 文件。
  • 分析: 此函数负责为一个给定的控制器决定使用哪个 ULyraPawnData 资产。ULyraPawnData 是一个数据资产,定义了 Pawn 的类、输入配置、相机模式、属性集等重要信息。
  • 在 LyraStarterGame 中的应用:
    • 英雄定义: 这是实现“英雄”(即玩家可操控角色)系统的核心。不同的英雄(如机枪兵、刺客)对应不同的 PawnData
    • 获取流程:
      1. 首先检查控制器的 PlayerState 是否已经设置了 PawnData(这通常用于实现英雄选择功能)。
      2. 如果未设置,则回退到当前加载的 LyraExperienceDefinition(游戏体验)中定义的默认 PawnData
      3. 如果体验也未定义,则最终回退到资源管理器中的全局默认 PawnData
    • 这种层级结构使得游戏可以灵活地为不同模式(如 PVP、PVE)设置不同的默认英雄,同时支持玩家在游戏中自定义选择。
InitGame
  • 定义位置: .cpp 文件。
  • 分析: 重写了引擎的 InitGame 函数。在调用父类实现后,它设置了一个定时器,在下一帧执行 HandleMatchAssignmentIfNotExpectingOne
  • 在 LyraStarterGame 中的应用:
    • 异步初始化: 这是一种常见的模式,将复杂的初始化流程(如确定游戏体验)推迟到下一帧,确保游戏世界的基本框架已经建立完成,避免在初始化过程中出现不可预知的问题。
HandleMatchAssignmentIfNotExpectingOne
  • 定义位置: .cpp 文件。
  • 分析: 这是决定当前游戏会话应该使用哪个“游戏体验”(LyraExperienceDefinition)的核心逻辑。它按照一个明确的优先级顺序来查找 ExperienceId
  • 在 LyraStarterGame 中的应用:
    • 体验优先级系统: 这个优先级系统为游戏开发和运营提供了极大的灵活性:
      • 最高优先级 - URL 选项: 允许通过命令行或URL参数(如 ?Experience=BP_MyExperience)强制指定体验,常用于开发和测试特定模式。
      • PIE 覆盖 - 开发者设置: 在编辑器 Play-in-Editor 模式下,可以使用项目设置中指定的体验进行快速迭代。
      • 命令行: 在打包版本中也可以通过命令行启动指定体验。
      • 世界设置: 可以为每个地图指定一个默认的体验。
      • 专用服务器: 如果没有指定,则尝试作为专用服务器启动。
      • 最终回退 - 硬编码默认值: 如果所有方式都失败,则使用代码中指定的默认体验(B_LyraDefaultExperience)。
    • 最终,找到的 ExperienceId 会传递给 OnMatchAssignmentGiven
OnMatchAssignmentGiven
  • 定义位置: .cpp 文件。
  • 分析: 接收确定的 ExperienceId,并通过 GameState 上的 ULyraExperienceManagerComponent 来设置和加载该体验。
  • 在 LyraStarterGame 中的应用:
    • 这是启动游戏体验加载流程的触发器。ULyraExperienceManagerComponent 会异步加载指定的 LyraExperienceDefinition 资产,该资产包含了游戏所需的所有资源(如 PawnData, UI, GameplayCues, AI 等)的引用。
OnExperienceLoaded
  • 定义位置: .cpp 文件。
  • 分析: 这是一个回调函数,在 ULyraExperienceManagerComponent 完成体验加载后被调用。
  • 在 LyraStarterGame 中的应用:
    • 玩家生成信号: 一旦体验加载完成,就意味着游戏运行所需的所有数据和系统都已就绪。此时,函数会遍历所有已经登录但还没有 Pawn 的玩家控制器,并调用 RestartPlayer 来生成他们的角色。
    • 无缝衔接: 这确保了玩家不会在资源加载完成前被生成到一个不完整的世界中,避免了各种加载相关问题。
GetDefaultPawnClassForController_Implementation
  • 定义位置: .cpp 文件。
  • 分析: 重写了引擎的虚函数,用于为特定控制器提供要生成的 Pawn 类。
  • 在 LyraStarterGame 中的应用:
    • 它不再硬编码一个 Pawn 类,而是通过 GetPawnDataForController 查询到对应的 ULyraPawnData,然后返回该数据资产中定义的 PawnClass。这使得每个英雄都可以拥有自己独特的角色类。
SpawnDefaultPawnAtTransform_Implementation
  • 定义位置: .cpp 文件。
  • 分析: 重写了引擎的虚函数,用于在指定位置生成 Pawn。
  • 在 LyraStarterGame 中的应用:
    • 在生成 Pawn 的基础上,增加了 Lyra 特有的逻辑:它查找生成的 Pawn 身上的 ULyraPawnExtensionComponent,并将从 GetPawnDataForController 获取到的 PawnData 设置给它。
    • 数据驱动: 这个步骤至关重要,它将定义英雄行为的数据资产注入到实际的 Pawn 实体中,后续的系统(如输入、能力、相机)都可以从这个组件读取配置信息。
ShouldSpawnAtStartSpot
  • 定义位置: .cpp 文件。
  • 分析: 重写此函数并始终返回 false
  • 在 LyraStarterGame 中的应用:
    • 这明确告知引擎不要使用其内置的、简单的玩家起始点分配逻辑。Lyra 使用更复杂、更智能的 ULyraPlayerSpawningManagerComponent 来处理生成逻辑,该组件可以支持团队生成区、重生点占领等高级功能。
ChoosePlayerStart_ImplementationFinishRestartPlayer
  • 定义位置: .cpp 文件。
  • 分析: 这两个函数都将具体的生成和重生逻辑委托给了 GameState 上的 ULyraPlayerSpawningManagerComponent
  • 在 LyraStarterGame 中的应用:
    • 职责分离: 将生成策略从 GameMode 中分离出来,使得生成逻辑可以独立于游戏模式进行扩展和修改。ULyraPlayerSpawningManagerComponent 可以根据游戏规则(如团队、存活状态等)智能地选择最佳的重生点。
PlayerCanRestart_ImplementationControllerCanRestart
  • 定义位置: .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 会读取命令行参数(如 UserExperiencePlaylist)来确定要托管的游戏会话(如特定的地图循环或模式),然后通过 CommonSessionSubsystem 来实际创建并托管一个在线会话,引导服务器进入正确的地图。

总结

ALyraGameMode 是 LyraStarterGame 项目的游戏规则和流程控制中枢。它通过一个高度可配置、数据驱动的“游戏体验”系统来管理游戏内容,并通过委托和组件将具体职责(如生成、经验管理)分发给其他专门系统。这种模块化、事件驱动的设计使得 Lyra 框架非常灵活,能够轻松支持从死亡竞赛到复杂合作 PVE 等多种游戏模式,同时为在线服务、专用服务器和复杂的英雄系统提供了坚实的基础。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值