LyraStarterGame_5.6 Experience系统分析

1. 核心概念

Experience(经验)是Lyra游戏的核心配置单元,用于定义:

  • 要激活的游戏特性插件
  • 默认Pawn数据
  • 经验加载/激活时执行的动作
  • 可复用的动作集合

2. 主要组件

2.1 ULyraExperienceDefinition

定义在LyraExperienceDefinition.h中,是一个PrimaryDataAsset,包含:

复制代码
cpp 复制代码
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中,用于组合可复用的动作:

复制代码
cpp 复制代码
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 设置当前经验

复制代码
cpp 复制代码
void ULyraExperienceManagerComponent::SetCurrentExperience(FPrimaryAssetId ExperienceId)

{

    // 通过资源ID获取经验定义

    // 设置当前经验并开始加载

    StartExperienceLoad();

}

3.2 开始加载过程

复制代码
cpp 复制代码
void ULyraExperienceManagerComponent::StartExperienceLoad()

{

    // 加载经验定义和相关资源

    // 异步加载资源包

    // 绑定资源加载完成回调

}

3.3 资源加载完成

复制代码
cpp 复制代码
void ULyraExperienceManagerComponent::OnExperienceLoadComplete()

{

    // 收集游戏特性插件URL

    // 加载并激活游戏特性插件

    // 状态转换为LoadingGameFeatures

}

3.4 游戏特性插件加载完成

复制代码
cpp 复制代码
void ULyraExperienceManagerComponent::OnGameFeaturePluginLoadComplete(const UE::GameFeaturs::FResult& Result)

{

    // 减少正在加载的插件计数

    // 当所有插件加载完成后,调用

    OnExperienceFullLoadCompleted()

}

3.5 经验完全加载完成

复制代码
cpp 复制代码
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数据:

复制代码
cpp 复制代码
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系统,建议:

  1. 理解PrimaryDataAsset的概念和使用方法
  2. 学习GameFeature插件的开发和管理
  3. 研究异步加载和资源管理
  4. 分析经验加载流程的状态转换
  5. 理解动作执行系统的设计和实现

通过掌握这些概念,您可以更好地理解Lyra游戏的架构设计,并应用到自己的项目中。

相关推荐
郝学胜-神的一滴2 小时前
Linux C++会话编程:从基础到实践
linux·运维·服务器·开发语言·c++·程序人生·性能优化
烤麻辣烫2 小时前
黑马大事件学习-16 (前端主页面)
前端·css·vue.js·学习
SadSunset2 小时前
(5)spring的set注入
java·笔记·spring·架构
lly2024062 小时前
jQuery AJAX 简介
开发语言
盼哥PyAI实验室2 小时前
Python多线程实战:12306抢票系统的并发处理优化
java·开发语言·python
好评1242 小时前
【C++】继承与多态:从语法到底层原理
开发语言·面向对象·类与对象
历程里程碑2 小时前
C++ 8:list容器详解与实战指南
c语言·开发语言·数据库·c++·windows·笔记·list
UpgradeLink2 小时前
Electron项目使用electron-updater与UpgradeLink接入参考
开发语言·前端·javascript·笔记·electron·用户运营
嗷嗷哦润橘_2 小时前
AI Agent学习:MetaGPT项目之debate.py
学习