【技术探索】Lyra 框架拆解(八·终篇):UI 系统 —— GameplayTag 驱动的发布/订阅式 UI 注入
系列导航 篇 主题 一 架构哲学总览 二 Experience 系统 三 Character 组件体系 四 GAS 集成层 五 Equipment & Inventory 六 Input 系统 七 网络同步框架 八 UI 系统(本文 · 终篇) 一句话Lyra 的 UI 系统是一个四层可组合架构——其核心不是一个 AHUD 子类,而是一个 GameplayTag 驱动的发布/订阅引擎(UUIExtensionSubsystem)。GameFeature 插件通过 GameplayTag 约定向 HUD 发布 Widget,HUD Layout 通过 ExtensionPoint 接收 Widget——双方互不知道对方存在。这套架构也是 CommonUI 在”多人分屏 + 跨平台输入”场景下的一个值得参考的实践。 一,为什么不直接用 UMG HUD?在传统 UE 项目中,最自然的 UI 做法是: 1234AHUD::BeginPlay() { MainWidget = CreateWidget<U...
【技术探索】Lyra 框架拆解(七):网络同步框架 —— Iris + ReplicationGraph + FastShared 路径
系列导航 篇 主题 一 架构哲学总览 二 Experience 系统 三 Character 组件体系 四 GAS 集成层 五 Equipment & Inventory 六 Input 系统 七 网络同步框架(本文) 八 UI 系统 一句话Lyra 的网络同步架构不是”用一套方案解决所有问题”——它构建了四层分层协作体系,从底层的 Iris 序列化到上层的 VerbMessage 消息广播,每一层解决一个粒度的同步需求。一个值得注意的设计决策:ReplicationGraph 默认禁用——先跑起来,性能瓶颈出现时再逐层启用优化。 一,五层同步架构1234567891011Gameplay 层: UPROPERTY(Replicated) / FFastArray / RPC ↓ 基础同步原语 —— 简单的 float/HUD 走属性,数组走 FastArray,一次性事件走 RPC消息层: FLyraVerbMessage(FFastArray + GameplayMessageSubsy...
【技术探索】Lyra 框架拆解(六):Input 系统 —— GameplayTag 作为输入与能力的胶水层
系列导航 篇 主题 一 架构哲学总览 二 Experience 系统 三 Character 组件体系 四 GAS 集成层 五 Equipment & Inventory 六 Input 系统(本文) 七 网络同步框架 八 UI 系统 一句话Lyra 在 UE Enhanced Input 之上增加了一个GameplayTag 路由层——InputConfig 把按键映射为语义 Tag,AbilitySet 把 Tag 关联到具体 GA,运行时 ASC 通过 Tag 匹配完成”按键 → 能力”的路由。这个中间层是 Lyra 模块化架构的”胶水”——没有它,GameFeature 的热加载/卸载在输入层就卡死了。 一,标准 Enhanced Input 的问题标准做法123// 直接绑定:InputAction 指针 → Callback 函数EnhancedInputComponent->BindAction(IA_Fire, ETriggerEvent::Triggered, this, &A...
【技术探索】Lyra 框架拆解(五):Equipment & Inventory —— Fragment 模式与三段式装备架构
系列导航 篇 主题 一 架构哲学总览 二 Experience 系统 三 Character 组件体系 四 GAS 集成层 五 Equipment & Inventory(本文) 六 Input 系统 七 网络同步框架 八 UI 系统 一句话Lyra 的 Equipment/Inventory 系统用三层分离架构实现了”武器切换 = AbilitySet 的 GiveTo + TakeFrom”——Inventory 管”你拥有什么”,Equipment 管”你正装备什么”,QuickBar 做两者之间的策略桥接。而 Fragment 模式让物品定义像积木一样可组合,避免了”武器类膨胀到 5000 行”的问题。 一,三层架构全景12345678910111213141516171819202122Inventory(数据容器层)—— "你拥有什么" ULyraInventoryManagerComponent (挂载在 PlayerState) ├── FLyraInventoryL...
【技术探索】Lyra 框架拆解(四):GAS 集成层 —— 五大封装与 DataAsset 驱动哲学
系列导航 篇 主题 一 架构哲学总览 二 Experience 系统 三 Character 组件体系 四 GAS 集成层(本文) 五 Equipment & Inventory 六 Input 系统 七 网络同步框架 八 UI 系统 一句话Lyra 的 GAS 层不是简单的”使用”原生 GameplayAbilitySystem——它用五个封装层将 GAS 改造成完全 DataAsset 驱动、GameplayTag 中介、模块化注入的子系统。同一个 ALyraCharacter 在不同 Experience 中呈现完全不同的能力组合,这一切不需要写一行硬编码的 GiveAbility()。 一,与标准 GAS 的核心差异标准 GAS 的做法12345678910// 传统 UE:在 Actor 构造中硬编码所有能力AMyCharacter::AMyCharacter() { ASC = CreateDefaultSubobject<UAbilitySystemComponent>("A...
【技术探索】Lyra 框架拆解(三):Character 组件体系与 InitState 状态机
系列导航 篇 主题 一 架构哲学总览 二 Experience 系统 三 Character 组件体系(本文) 四 GAS 集成层 五 Equipment & Inventory 六 Input 系统 七 网络同步框架 八 UI 系统 一句话ALyraCharacter 不是一个”角色”,而是一个”插槽”——它只做三件事:创建核心 Component、转发接口调用、初始化死亡流程。所有真正的游戏逻辑全部下沉到独立的 PawnComponent 中,由 GameplayTag 驱动的 InitState 状态机协调初始化顺序。 一,继承链:从 Engine 到 Lyra123ACharacter (Engine) └─ AModularCharacter (ModularGameplayActors 插件) └─ ALyraCharacter (LyraGame) AModularCharacter 极其简单——它只重写了三个函数: 123456789101112void PreInitializeCompone...
【技术探索】Lyra 框架拆解(二):Experience 系统 —— 玩法配方表
系列导航 篇 主题 一 架构哲学总览 二 Experience 系统(本文) 三 Character 组件体系与 InitState 状态机 四 GAS 集成层 五 Equipment & Inventory 六 Input 系统 七 网络同步框架 八 UI 系统 一句话Experience 是一张”玩法配方表”——它用一个 DataAsset 回答了”这场游戏玩什么”:激活哪些 GameFeature 插件、执行哪些初始化动作、玩家用什么样的 Pawn。 一,问题:GameMode 子类为何不够在 Standard UE 中,为不同模式创建不同的 AGameModeBase 子类是标准做法: 12345// 传统方案:每增加一个模式 = 一个新类AGameModeBase ├── AGameMode_TDM → PawnClass = B_Hero_TDM, HUDClass = B_HUD_TDM ├── AGameMode_CP → PawnClass = B_Hero_CP, HUD...
【技术探索】Lyra 框架拆解(一):架构哲学总览 —— 薄 Actor + 厚 Component + GameFeature 插件化
系列导航 篇 主题 一 架构哲学总览(本文) 二 Experience 系统:玩法配方表 三 Character 组件体系与 InitState 状态机 四 GAS 集成层 五 Equipment & Inventory 六 Input 系统 七 网络同步框架 八 UI 系统 一句话理解 LyraLyra 不是”一个游戏”,而是一套”做游戏的游戏”——它是 Epic 在 UE5 时代给模块化多人游戏的参考答案。它的核心命题是: 如何在不为每个游戏模式写一个 AGameMode 子类的前提下,让同一个 ALyraCharacter 在射击模式、探索模式、TopDown 模式下呈现完全不同的能力组合? Lyra 的答案是四个字:数据驱动注入。C++ 提供能力框架,DataAsset 定义具体配方,GameFeature 插件负责物理隔离与按需加载。 一,四层架构全景图12345678910111213141516171819202122232425262728293031323334┌─────────────────────...