1. 核心概念
Experience(经验)是Lyra游戏的核心配置单元,用于定义:
- 要激活的游戏特性插件
- 默认Pawn数据
- 经验加载/激活时执行的动作
- 可复用的动作集合
2. 主要组件
2.1 ULyraExperienceDefinition
定义在LyraExperienceDefinition.h中,是一个PrimaryDataAsset,包含:
UPROPERTY(EditDefaultsOnly, Category = Gameplay) TArray<FString> GameFeaturesToEnable; // 要启用的游戏特性列表 UPROPERTY(EditDefaultsOnly, Category=Gameplay) TObjectPtr<const ULyraPawnData> DefaultPawnData; // 默认Pawn数据 UPROPERTY(EditDefaultsOnly, Instanced, Category="Actions") TArray<TObjectPtr<UGameFeatureAction>> Actions; // 游戏特性操作列表 UPROPERTY(EditDefaultsOnly, Category=Gameplay) TArray<TObjectPtr<ULyraExperienceActionSet>> ActionSets; // 经验操作集列表2.2 ULyraExperienceActionSet
定义在LyraExperienceActionSet.h中,用于组合可复用的动作:
UPROPERTY(EditAnywhere, Instanced, Category="Actions to Perform") TArray<TObjectPtr<UGameFeatureAction>> Actions; // 游戏特性操作列表 UPROPERTY(EditAnywhere, Category="Feature Dependencies") TArray<FString> GameFeaturesToEnable; // 要启用的游戏特性列表2.3 ULyraExperienceManagerComponent
定义在LyraExperienceManagerComponent.h/cpp中,是Experience系统的核心管理器,负责:
- 经验的加载和激活
- 状态管理和转换
- 游戏特性插件的加载和激活
- 动作的执行
- 网络复制
3. 经验加载流程
Experience系统的加载流程包含以下关键步骤:
3.1 设置当前经验
void ULyraExperienceManagerComponent::SetCurrentExperience(FPrimaryAssetId ExperienceId) { // 通过资源ID获取经验定义 // 设置当前经验并开始加载 StartExperienceLoad(); }3.2 开始加载过程
void ULyraExperienceManagerComponent::StartExperienceLoad() { // 加载经验定义和相关资源 // 异步加载资源包 // 绑定资源加载完成回调 }3.3 资源加载完成
void ULyraExperienceManagerComponent::OnExperienceLoadComplete() { // 收集游戏特性插件URL // 加载并激活游戏特性插件 // 状态转换为LoadingGameFeatures }3.4 游戏特性插件加载完成
void ULyraExperienceManagerComponent::OnGameFeaturePluginLoadComplete(const UE::GameFeaturs::FResult& Result) { // 减少正在加载的插件计数 // 当所有插件加载完成后,调用 OnExperienceFullLoadCompleted() }3.5 经验完全加载完成
void ULyraExperienceManagerComponent::OnExperienceFullLoadCompleted() { // 执行经验和动作集中的所有动作 // 状态转换为ExecutingActions → Loaded // 广播加载完成事件(高、中、低优先级) }4. 状态转换
Experience系统有以下状态转换:
- Unloaded → Loading → LoadingGameFeatures → ExecutingActions → Loaded
- 支持Deactivating状态用于停用经验
- 支持LoadingChaosTestingDelay状态用于测试延迟
5. 关键功能特性
5.1 网络复制
- 当前经验会自动复制到客户端
- 客户端在收到复制的经验后会自动开始加载
5.2 优先级事件系统
支持三种优先级的加载完成事件:
- CallOrRegister_OnExperienceLoaded_HighPriority:高优先级,用于游戏核心功能
- CallOrRegister_OnExperienceLoaded:普通优先级
- CallOrRegister_OnExperienceLoaded_LowPriority:低优先级,用于非核心功能
5.3 异步加载
- 资源和游戏特性插件采用异步加载方式
- 支持合并多个异步加载请求
- 支持取消加载处理
5.4 动作执行系统
- 支持在经验加载/激活/停用/卸载时执行动作
- 动作可以来自经验定义或动作集
- 支持动作的组合和复用
6. 使用示例
在LyraGameMode.cpp中,Experience系统被用于获取默认Pawn数据:
const ULyraPawnData* ALyraGameMode::GetPawnDataForController(const AController* InController) const { // 首先从PlayerState获取Pawn数据 // 如果没有,从当前经验中获取默认Pawn数据 ULyraExperienceManagerComponent* ExperienceComponent = GameState->FindComponentByClass<ULyraExperienceManagerComponent>(); check(ExperienceComponent); if (ExperienceComponent->IsExperienceLoaded()) { const ULyraExperienceDefinition* Experience = ExperienceComponent->GetCurrentExperienceChecked(); if (Experience->DefaultPawnData != nullptr) { return Experience->DefaultPawnData; } return ULyraAssetManager::Get(). GetDefaultPawnData(); } return nullptr; }7. 设计特点
- 模块化设计:将游戏功能拆分为可复用的游戏特性插件
- 数据驱动:使用PrimaryDataAsset定义经验,便于配置和管理
- 异步加载:提高游戏性能和响应性
- 网络同步:确保客户端和服务器使用相同的游戏配置
- 可扩展性:支持通过动作集扩展经验功能
8. 学习建议
要深入学习Experience系统,建议:
- 理解PrimaryDataAsset的概念和使用方法
- 学习GameFeature插件的开发和管理
- 研究异步加载和资源管理
- 分析经验加载流程的状态转换
- 理解动作执行系统的设计和实现
通过掌握这些概念,您可以更好地理解Lyra游戏的架构设计,并应用到自己的项目中。