当前位置: 首页 > news >正文

Lyra学习笔记 Experience流程梳理

目录

  • 前言
  • 1 创建
  • 2 加载
  • 3 Deactivate
  • 4 总结与图示

前言

这篇主要将视角放在Experience的流程,所以不会涉及一些更深的东西

之后ULyraExperienceManagerComponent简称为EMC

1 创建

完事开头难,首先找到了管理Experience的组件,那么它的初始化位置在哪?
其作为ALyraGameState的成员,在构造函数中用CreateDefaultSubobject创建。

//LyraGameState.h
private:// Handles loading and managing the current gameplay experienceUPROPERTY()TObjectPtr<ULyraExperienceManagerComponent>ExperienceManagerComponent;//LyraGameState.cpp
ALyraGameState::ALyraGameState(const FObjectInitializer& ObjectInitializer): Super(ObjectInitializer)
{...ExperienceManagerComponent = CreateDefaultSubobject<ULyraExperienceManagerComponent>(TEXT("ExperienceManagerComponent"));...
}

2 加载

结合EMC中的这个枚举梳理,初始为Unloaded

//LyraExperienceManagerComponent.h
ELyraExperienceLoadState LoadState = ELyraExperienceLoadState::Unloaded;
//其定义
enum class ELyraExperienceLoadState
{Unloaded,Loading,LoadingGameFeatures,LoadingChaosTestingDelay,ExecutingActions,Loaded,Deactivating
};

结合之前的地图加载流程分析,加载的流程开始于ULyraExperienceManagerComponent::SetCurrentExperience->

ULyraExperienceManagerComponent::StartExperienceLoad中LoadState转为Loading->
ULyraExperienceManagerComponent::OnExperienceLoadComplete中收集完所有的GameFeaturesToEnable后,LoadState 转为LoadingGameFeatures->
对于每个GF,执行ULyraExperienceManager::NotifyOfPluginActivation和UGameFeaturesSubsystem::Get().LoadAndActivateGameFeaturePlugin->

先忽略测试用状态LoadingChaosTestingDelay

ULyraExperienceManagerComponent::OnExperienceFullLoadCompleted中状态转为ExecutingActions并开始执行Actions,执行顺序为Experience本身Acitons中的每一个Action、遍历ActionSets,每一个ActionSets的Actions的每一个Action,对于单个Action,顺序执行OnGameFeatureRegistering()、OnGameFeatureLoading()、OnGameFeatureActivating(Context)->
Action执行完成后,状态进入Loaded,然后分别是OnExperienceLoaded三个优先级的多播

3 Deactivate

EndPlay触发DeActive->
DeActive涉及的GameFeature->
状态转为Deactivating->
同理按顺序触发每个Action的OnGameFeatureDeactivating、OnGameFeatureUnregistering()->
状态转为Unloaded ,CurrentExperience = nullptr;

4 总结与图示

在这里插入图片描述
在这里插入图片描述

http://www.xdnf.cn/news/749107.html

相关文章:

  • 5月31日day41打卡
  • 【Unity笔记】Unity WASD+QE 控制角色移动与转向(含 Shift 加速)实现教程
  • Qt -使用OpenCV得到SDF
  • thinkpad T-440p 2025.05.31
  • YOLOv10速度提升与参数缩减解析2025.5.31
  • 华为OD机试_2025 B卷_静态扫描(Python,100分)(附详细解题思路)
  • SAR ADC 同步逻辑设计
  • 【CBAP50技术手册】#31 Observation(观察法):BA(业务分析师)的“现场侦探术”
  • Kerberos面试内容整理-Kerberos 与 LDAP/Active Directory 的集成
  • 关于TongWeb数据源兼容mysql驱动的注意事项
  • 基于晶体塑性有限元(CPFEM)的钛合金圆棒拉伸过程模拟
  • 元胞自动机(Cellular Automata, CA)
  • 题海拾贝:P8598 [蓝桥杯 2013 省 AB] 错误票据
  • SHELL命令资料
  • C++类设计新思路:借鉴Promise链式调用的封装模式
  • CodeTop100 Day18
  • 【Python进阶】元编程、并发
  • @PathVariable注解-补充
  • (附代码)自定义 LangChain 文档分割器,深入探索 LangChain 文档分割策略与应用
  • 硬件开发全解:从入门教程到实战案例与丰富项目资源
  • 深入理解设计模式之解释器模式
  • Vue-过滤器
  • C++语法系列之模板进阶
  • 青柠日记:记录美好,守护隐私
  • RL 基础 (待补充)
  • 【Python Cookbook】文件与 IO(一)
  • Redis--缓存工具封装
  • 【PhysUnits】15.6 引入P1后的左移运算(shl.rs)
  • 佳能 Canon G3030 Series 打印机信息
  • 【C语言练习】075. 使用C语言访问硬件资源