我从一个可能让不少人惊讶的结论说起:UE5 里的 Lyra 示例项目,压根不是给你“看画面”的,它是一个真正可以拿来做产品的游戏架构模板。InsideLyra 这个标题的关键也在这里——它邀请你钻进项目内部,看清 Epic 自己是怎么组织一个现代射击游戏工程的。很多初学者双击打开 Lyra,看到满屏的 C++ 类、几十个插件、一堆 DataAsset,第一反应是“这玩意儿是给人学的吗”。但我可以负责任地说,只要路线对,Lyra 恰恰是目前 UE 初学者进阶为“能用工程思维做游戏”的最短路径之一。
这篇内容不是官方文档的翻译,是我自己从“打开项目一脸懵”到“能删掉不用的模块、加自己的玩法”整个过程的复盘。适合那些已经会摆场景、连过蓝图、做过几个小 Demo,但一碰大型工程就发怵的 UE 学习者。我会把 Lyra 拆开揉碎,告诉你哪些该看、哪些该跳过、哪些坑我替你踩过了。
1. Lyra 到底是什么:它跟你以前见过的所有示例项目都不一样
先搞清楚定位。UE 商城和启动器里的很多示例项目,核心目的是“展示画面”或“演示某个功能”,打开就能跑,资源一大堆,代码却很薄。Lyra 不是这个路数。它是 Epic 在开发 UE5 的过程中,为了让引擎内部团队能持续吃到自己的狗粮,专门搭建的一套完整游戏框架,后来才作为示例项目放出来。这意味着它包含的不是一个 Demo,而是一整套工程规范。
1.1 我为什么在标题里强调“初学者”三个字
这年头“初学者”这个词被用烂了。很多教程所谓的“面向初学者”,其实只是把步骤拆细一点,本质还是教你怎么拖节点。Lyra 里的“初学者”,指的是已经到了需要建立一个完整的“游戏玩法架构”认知的阶段——你并不需要在 C++ 层面很厉害,但你必须愿意去理解一个项目是如何组织起来的。
我自己经历过一个典型阶段:会用蓝图写移动、开火、伤害,但项目一复杂就乱,变量满天飞,事件分发靠广播和 Direct 硬连。后来硬着头皮啃 Lyra,才意识到我之前缺的不是“更多技巧”,而是“正确的分层思路”。Lyra 把玩法、表现、输入、UI、数据全部拆解到不同的模块和插件里,这个拆法本身就是最好的教材。
1.2 Lyra 的出身:Epic 内部项目转向公开样例后意味着什么
Lyra 前身是 Epic 内部孵化项目,早期被称为“Sample Game”。它在 2022 年随着 UE5.0 的迭代逐步公开,后续每个引擎版本都会同步更新。这里有个关键信息:Lyra 不是按“教学 Demo”的标准写的代码,而是按“可上线产品”的标准写的。所以你会看到它有很多初学者看来“多余”的东西,比如复杂的状态管理、平台相关的用户子系统、通用 UI 框架、模块化加载流程等等。
这些东西在一个单人开发的小游戏里可能确实用不上。但理解它们有一个巨大的价值:UE5 之后的很多官方功能和技术方案,都在向 Lyra 的思路靠拢。引擎里的 Gameplay Features、Enhanced Input、CommonUI、GAS 这些系统,Lyra 是怎么把它们串在一起的,这几乎就是 Epic 推荐的标准答案。你早一天看懂,就早一天站在官方思路上。
1.3 它到底覆盖了 UE5 里哪些“出厂机”能力
简单列一下 Lyra 里实际用到的大块头:
- Gameplay Ability System(GAS):技能、伤害、Buff 的数据驱动框架
- Enhanced Input:新版输入系统,支持输入上下文切换和按键绑定
- CommonUI:通用 UI 框架,解决手柄/键鼠焦点切换、UI 层叠、输入接管问题
- Game Features 与 Modular Gameplay:把玩法拆成独立插件特性,按需加载
- DataAsset 驱动的配置体系:玩法参数大量放在数据资产里,而不是硬编码
- 完整的客户端/服务器架构处理:包括 Listen Server、Dedicated Server 下的初始化流程
这些名字初学者可能一个都没听过。没关系,后面我会挑重点讲。你只需要先建立一个观念:Lyra 是一台把所有 UE5 前沿系统组装起来的展示车,你要学的不是某个引擎功能怎么用,而是整套工程是怎么被拼出来的。
2. 先别急着改代码:把 Lyra 的模块地图画进脑子里
我第一次打开 Lyra 工程时,点开 Content 目录,看到 LyraGame、LyraExtras、Plugins 一大堆文件夹,直接懵了几分钟。我劝你别走这条路。看 Lyra 之前,先在脑子里画一张模块地图,知道什么功能在哪一块,接下来的阅读效率会翻倍。
2.1 九个大插件到底各管什么事
Lyra 工程里的 Plugins 目录是精髓。我按自己的理解给它们分了个组:
| 插件/模块 | 功能定位 | 初学者关注优先级 |
|---|---|---|
| ModularGameplay | 把 GameMode 拆成 Experience/GameFeature 的组合 | 极高 |
| GameFeatures | 玩法特性插件化,按需启用/禁用 | 高 |
| GameplayAbilities | GAS 主体,技能与属性框架 | 高 |
| CommonGame | 平台通用逻辑,UI 与输入桥接 | 中 |
| CommonUser | 用户/平台初始化,登录与权限 | 中 |
| CommonLoadingScreen | 加载界面管理 | 低 |
| GameplayMessageRouter | 全局消息路由,解耦系统间通信 | 高 |
| LyraInventory | 物品与库存示例 | 中 |
| UI 相关扩展 | 通用 UI 控件样式 | 低 |
我不建议你第一遍就把这些插件全部读完。先抓三条主线:ModularGameplay 和 Experience 是怎么驱动整局游戏的,GAS 是怎么承担伤害与技能的,GameplayMessageRouter 是怎么让各系统之间不发散广播的。这三条线通了,Lyra 的骨架你就拿下了。
2.2 最核心的流程主线:从 Pawn 数据到玩家控制的组装逻辑
传统的 UE 开发里,GameMode 负责生成 Pawn,Pawn 里挂上移动组件、武器组件、相机,然后 GameMode 再慢慢调属性。Lyra 把这个过程完全打散重构成了“Experience + PawnData + AbilitySet + InputConfig”的组合流程。
简化后的主流程是这样的:
- 地图启动时读取一个 Experience DataAsset
- Experience 里指定了 GameplayFeatures、PawnData、ActionSets 等配置
- 系统根据 PawnData 中的信息生成玩家 Pawn,并挂接对应的 GameplayAbility 集合
- Pawn 上的 Extension 组件负责在运行时把输入映射(Enhanced Input Context)、相机模式、能力集初始化好
- 玩家控制的真正逻辑高度集中在 GameplayAbility 里,而不是蓝图的 Tick 或 Pawn 的 C++ 方法
这个流程对初学者最大的冲击在于:你不能再靠“在 GameMode 里写一大坨”来组装角色,而是要理解“数据资产里声明配置,组件在合适时机干活”的思路。一开始会很别扭,但当你需要做角色切换、不同模式不同技能组合时,就会发现这种方式的优势。
2.3 数据驱动到底驱动到了什么程度
Lyra 里的数据驱动不只是把几个数值放在 DataTable 里,而是把玩法结构本身都数据化了。比如:
- Experience 是 DataAsset
- PawnData 是 DataAsset
- AbilitySet 是 DataAsset
- InputConfig 是 DataAsset
- EquipmentDefinition 是 DataAsset
这些资产之间的关系,通过编辑器里肉眼可见的引用连接起来。你打开一个 Experience 资产,跟着引用往后点,就能看到一整条玩法链路:初始技能、默认武器、输入绑定、可用的角色类别。这意味着你改玩法时,很多时候不是在“写逻辑”,而是在“配数据”,逻辑尽量复用,数据千变万化。
我建议初学者用一个笨办法做第一遍预习:把 DA_Example_Experience 这个资产里的每个引用字段都点一遍,把整张引用图截图存下来,对照着去看 C++,你会有一种豁然开朗的感觉。
3. 初学者最容易栽进去的四个坑
我见过太多人下载 Lyra 后两三天就放弃,原因基本都集中在这几类问题上。我自己也都是踩过的,每一个都展开说说。
3.1 坑一:把它当成“资源模板”,直接在空工程里导入
很多人习惯性打开 UE 商城下载的资源,把 Content 文件夹直接拷进自己的项目。Lyra 不能这么玩。它的功能大量依赖 C++ 插件,而且这些插件是和 Lyra 工程本身匹配的。你单独把 Content 目录搬到别的工程里,大概率会出现几百条编译错误或者一堆缺失引用。
正确姿势是用 Epic 启动器或源码克隆的方式,把整个 Lyra 工程作为独立项目运行。如果你有源码版本的 UE5,我更建议直接编译源码版 Lyra,因为后续调试时你能跟到 C++ 内部,这对学架构非常有帮助。
提示:如果你的机器配置不是很好,建议先用二进制版 Lyra,确认能跑起来,再考虑源码版。不要一开始就陷入编译地狱。
3.2 坑二:还没搞懂 GAS 就想改 Lyra 的伤害逻辑
Lyra 的伤害完全建立在 GAS 上:技能(GameplayAbility)、效果(GameplayEffect)、属性集(AttributeSet)三者协作。初学者拿到后最容易做的事是——找到子弹碰撞函数,直接把伤害数值改掉。结果发现子弹命中后伤害不一定生效,因为伤害可能由 GameplayEffect 动态计算,或者技能通过 WaitGameplayEvent 等待触发,伤害判定根本不发生在你想象的那个函数里。
我的建议是,先花两三天系统过一遍 GAS 的核心概念(不是全部,是核心),再回来看 Lyra 的伤害管线。重点理解这几个问题:
- GameplayEffect 怎么修改 AttributeSet 里的属性
- Ability 怎么触发、怎么被取消、怎么响应输入
- TargetActor 和 Wait Target Data 是怎么完成“瞄准并应用效果”的
这四个问题打通,Lyra 的射击、技能、伤害你看代码就顺了。
3.3 坑三:CommonUI 和输入系统的绑定关系绕得人头昏
很多初学者打开 Lyra 后,发现 UI 上的按钮按不下去,或者手柄按键没反应,以为是自己代码写错了。其实 Lyra 的 UI 交互走的是 CommonUI 的激活机制:一个 CommonActivatableWidget 被推入 UI 层时,会决定输入是交给 UI 还是交给游戏。
传统开发里,UI 和游戏输入是各管各的。Lyra 里则是通过 CommonUI 的 Input Config 与 Enhanced Input 的 Mapping Context 协作。你看 Lyra 的 HUD 布局,会发现每层 UI 激活时,系统会自动切换输入模式。这很强大,但对新手极不友好。
我给个绕过陷阱的实用法:想改 UI,先不要动 C++,从 DataDriven 的结合点入手。找到 CommonUI 的 Activation 相关设置,再看 UI 对应的 InputAction 和 Mapping Context,确认激活顺序。先跑通一个小功能(比如按 Tab 打开背包、按 Esc 关闭),再回头研究深层原理。
3.4 坑四:照着网上的老教程改蓝图,结果发现全是 C++
Lyra 和许多使用旧版 UE 示例项目的教程严重水土不服。网上很多教程是用蓝图讲解传统 GameMode 流程,放到 Lyra 里很多直接失效。更麻烦的是,Lyra 大量初始化逻辑写在 C++ 的组件和函数里,你在蓝图里点一下,底层可能是负责的 C++ 调用了两次或者时机不对。
应对方法不是“去把 C++ 全学完”,而是学会阅读类结构。打开一个 Lyra C++ 类,先看它的头文件里的 UCLASS 和 UPROPERTY 声明,再看它继承自谁、持有哪些组件、暴露了什么蓝图表节点。到了这一步,蓝图上找不到的底层行为你就知道该去哪儿找了。
3.5 坑五:改了数据资产,结果没生效
Lyra 的数据资产在编辑器里看起来就是普通资产,改起来很直观。但有个隐藏机制:很多数据资产会被缓存到 CDO(Class Default Object)里,或者被某些 GameFeature 插件在加载时解析。你改了 DA_ 资产,但如果运行时机不对或者没让对应模块重新加载,游戏里看到的还是旧数据。
遇到这种情况,别急着重编译,先检查三件事:
- 是不是改错了副本(比如改的是 Content 下某个子目录的资产,而不是实际引用的那个)
- 对应的 GameFeature 插件是不是没有启用或者重新加载
- 改完后是否完全关闭游戏重新运行(有些配置只会在启动时加载)
我第一次改 Lyra 的默认武器数据,改了半个多小时没生效,最后发现原因就是项目里有两个几乎同名的数据资产,改错了位置。
4. 建议的实操路径:四步把 Lyra 变成你自己的玩具
说了一堆理论,现在讲讲我建议新手真正动手要走的四步。这一步一步做完,你基本就摆脱了“打开 Lyra 看不懂”的状态。
4.1 第一步:用 Gameplay Debugger 观察一局完整游戏
不是让你先看代码,而是先运行起来,开着调试工具观察整个流程。具体这样操作:
- 选择 Lyra 示例地图(比如 ShooterMap)启动
- 按 ~ 键打开控制台,输入对应命令启用 Gameplay Debugger(GAS 相关能力状态)
- 观察角色生成、血量属性、正在激活的技能列表
- 开枪、翻滚、换弹,看这些动作在 Gameplay Debugger 里表现为哪些 Ability 被激活
这一步的核心目标是让你直观感受到“游戏里发生的每一个行为,背后都有一个 Ability 在跑”。我从这一步开始真正理解了 GAS 的异步性和事件驱动,比光看文档有效十倍。
4.2 第二步:新增一个武器/技能,走通 Equipment 流程
这是第一个真正动手的任务。建议不要做太复杂的武器,就用现有武器复制一份,改数值、改发射效果、换一个技能集,然后从“拾取物”或“初始装备列表”里把新武器挂进去。
关键理解点在于 Lyra 的 Equipment 管线:
- EquipmentDefinition 定义这把武器具备哪些 GameplayAbility
- EquipmentInstance 是运行时生成的实际 Actor
- 切换武器的过程实际是:从 Inventory 中移除当前实例 -> 卸载当前 AbilitySet -> 加载新实例的 AbilitySet
你走完这个流程后,会深刻理解“组件 + 数据 + 技能”三者的关系。如果你愿意,还可以试着让新武器拥有一个主动技能(比如手雷),去 PAWN 的 AbilitySet 里注册它,这样你就打通了从输入到技能触发再到效果的完整链路。
4.3 第三步:修改小地图和 HUD,理解 CommonUI 的 UI 栈逻辑
到了这一步,很多人已经不再害怕 Lyra 的 C++ 了,开始敢于动 UI。我的建议是从 HUD 布局开始,因为它是最直观的“UI 层”概念。Lyra 的 HUD 是由多个 CommonActivatableWidget 组成的,它们按层级压在一起。
实操任务:
- 找到 HUDLayout,删除或新增一个 Widget 面板
- 在某个层上添加一个自定义的通用 Widget,显示玩家当前血量
- 绑定血量的属性变化事件,让 Widget 实时刷新
过程中你会碰到“为什么我这个 Widget 接收不到输入”“为什么我点了按钮游戏角色也动了”之类的问题,这些问题的答案都在 CommonUI 的输入接管机制里。等你能熟练控制 UI 什么时候接管输入、什么时候让输入穿透到游戏层,你就掌握了 Lyra UI 的核心。
4.4 第四步:删除默认玩法,接入你自己的游戏模式
这一步是真正的“毕业设计”。试着把 Lyra 默认的 Shooter 玩法替换成自己的一个简单玩法。比如保留移动和 GAS,但把射击换成“近战攻击 + 互动开门”,或者把游戏从射击改成临时的小型解谜。
你会被迫思考:该修改哪些 Experience 配置、保留哪些模块、删掉哪些模块、要不要重新定 PawnData。我之前做这一步时,卡得最久的是“怎么去掉射击但保留 GAS”,后来发现关键是新建一个自己的 Experience 和 PawnData,不再引用默认的 AbilitySet,而不是试图去改造默认的哪里。
这时你会发现,Lyra 的模块化设计让你能像搭积木一样替换玩法,而不用推翻整栋楼。这种感觉一旦建立,你就真的开始用“工程思维”做游戏了。
5. 学 Lyra 前要做的心理准备和基础清单
最后聊聊心态和基础。Lyra 对初学者真正的门槛不是某个技术难点,而是“和你以前习惯的开发节奏完全不同”带来的挫败感。
5.1 你需要的基础知识清单
在我推荐别人上手 Lyra 之前,我一般先问三件事:
- 是否理解 UE 基本的 Actor、Component、Pawn、PlayerController 这些概念
- 是否自己写过蓝图小游戏(哪怕只是移动加碰撞)
- 是否愿意接受一个概念:游戏内容绝大多数可以由数据资产驱动
如果这三条都满足,你就可以直接上手 Lyra。如果连 Actor 和 Component 区别都不清楚,建议先回 UE 的官方初学者教程跑通一遍再说。C++ 不是必须的,但你至少要能读懂“类的继承关系和成员变量”,否则你看源码会非常痛苦。
5.2 正确姿势:能读代码就不要只看节点
很多人在 Lyra 里遇到不会的,就在蓝图里翻节点,发现连不上又开始怀疑人生。我的建议是反过来:遇到问题先查 C++,把继承链和关键函数搞明白,再回头看蓝图。蓝图在 Lyra 里往往只是“对 C++ 的浅封装”。
我举个例子,想知道“角色的输入怎么传给技能”,你直接找 PawnExtensionComponent 和 InputComponent 相关的 C++ 代码,读几遍就明白输入数据怎么转成 Ability 的触发事件。如果你在蓝图里找,可能找很久都找不到。
5.3 我的个人体会:什么时候从 Lyra 毕业
学 Lyra 不一定是为了“在 Lyra 工程里做游戏”。对我来说,它的价值在于提供了一个标准的现代 UE5 工程参照系。当你发现自己能做到以下任意一条,你就可以“毕业”了:
- 能独立看懂某个功能模块在 Lyra 里的完整实现链路,并解释给别人听
- 能在不动默认模块的情况下,新增一个自己的游戏模式
- 能判断某一个 UE5 新系统(比如增强输入、GAS、CommonUI)在 Lyra 里是怎么集成的,并复用到自己的工程
毕业之后,你大概率不会继续用 Lyra 做完整产品,但它带给你的架构观念会一直跟着你。我后来做自己项目时,哪怕不用 GAS,也会下意识地把输入、能力、表现拆成数据驱动和组件协作的方式,项目结构清爽了很多。
最后再分享一个自己啃 Lyra 时的小技巧:准备一个“问题清单”文档,把每个看不懂的类名和概念记下来,然后逐个去 UE 文档或者社区搜索解决。不要妄想一遍读懂,第一遍先建立地图,第二遍抓主线,第三遍再抠细节。按这个节奏来,《InsideLyra》就真的从“劝退标题”变成你的 UE 进阶加速器了。