UE5 Lyra项目源码分析-关卡配置加载
最近刚学完一套教程,准备研究研究官方的源码,看看自己能不能看懂。
当前分析只在本人能力之下能够分析的内容,如果有一些问题,还请大家指出。
开始
如果你打开一个别人的项目,你会从哪里看起,如果是我,我现在会先打开项目设置,地图和模式,查看设置的GameMode和GameInstance,从这里开始看。
可以看到,Lyra项目将这些内容的默认设置全改成了,个性化定义。
GameMode关系着整个玩法的相关内容,比如一个游戏可以有多种玩法,可以通过切换不同GameMode实现。
GameInstance管理整个游戏的生命周期,Lyra在这里主要实现了网络通信的相关内容。
我们从GameMode看起,GameMode里的InitGame,将会在下一帧执行一个函数,我现在推测这样的原因是为等待GameMode相关的内容都初始化完成,然后再去执行关卡数据配置加载。
函数里会通过各种方式去获取配置的资源ID(用户资产每个资产都会有一个固定的ID)
分别从URL 选项(OptionsString)
如果是在编辑器模式下运行(IsPlayInEditor()),检查开发者设置(ULyraDeveloperSettings)中的 ExperienceOverride。
检查命令行中是否提供了 Experience 参数(Experience=)。
检查当前地图的 WorldSettings 是否指定了默认的 Experience。
如果都没有,那么将回退到默认的资源ID
接着判断ID是否有效,然后通过LyraGameState身上的组件进行初始化,GameState管理着所有的PlayerState
这个组件是在LyraGameState里初始化的
在ULyraExperienceManagerComponent组件里的SetCurrentExperience函数,会通过获取到的资源ID,去加载配置,并进行初始化函数调用。
接着是函数StartExperienceLoad,这个函数里,会进行资源加载,里面进行了几件事
- 将状态设置为加载状态
- 从资产配置里获取需要加载的内容
- 根据客户端和服务器区分加载不同的内容
- 设置异步资源加载回调
- 将加载包添加到异步加载队列,开始异步加载,不会阻塞当前运行队列
加载完成,将会调用OnExperienceLoadComplete资源加载完成函数,这里将会先验证配置数据,然后保存插件路径的数组清空。
设置一个查询所需加载插件的路径,在添加时,还进行了去重处理。
从配置里通过上面的函数,找到所需加载的插件的路径
然后对所有插件进行加载,加载完成调用OnExperienceFullLoadCompleted函数
在OnExperienceFullLoadCompleted函数里,首先模拟延迟,并修改加载状态枚举
定义一个插件激活所需的上下文
定义激活操作函数
将配置项里的插件依次激活
最后修改加载状态,并广播委托
关卡配置项
上面,我们查看了代码对关卡配置加载和处理的流程,接下来,我们看一下配置项的内容。
/*** Definition of an experience*/
UCLASS(BlueprintType, Const)
class ULyraExperienceDefinition : public UPrimaryDataAsset
{GENERATED_BODY()public:ULyraExperienceDefinition();//~UObject interface
#if WITH_EDITORvirtual EDataValidationResult IsDataValid(class FDataValidationContext& Context) const override;
#endif//~End of UObject interface//~UPrimaryDataAsset interface
#if WITH_EDITORONLY_DATAvirtual void UpdateAssetBundleData() override;
#endif//~End of UPrimaryDataAsset interfacepublic:// List of Game Feature Plugins this experience wants to have activeUPROPERTY(EditDefaultsOnly, Category = Gameplay)TArray<FString> GameFeaturesToEnable;/** The default pawn class to spawn for players *///@TODO: Make soft?UPROPERTY(EditDefaultsOnly, Category=Gameplay)TObjectPtr<const ULyraPawnData> DefaultPawnData;// List of actions to perform as this experience is loaded/activated/deactivated/unloadedUPROPERTY(EditDefaultsOnly, Instanced, Category="Actions")TArray<TObjectPtr<UGameFeatureAction>> Actions;// List of additional action sets to compose into this experienceUPROPERTY(EditDefaultsOnly, Category=Gameplay)TArray<TObjectPtr<ULyraExperienceActionSet>> ActionSets;
};
以上是配置的类,它是继承至UPrimaryDataAsset数据资产的,它是一种UE管理的数据资产类
UCLASS(BlueprintType, Const) 设置Const,标识了此实例的内容只读,不能够修改。
类里,覆写了两个函数
- IsDataValid 在编辑器中校验数据的有效性
- UpdateAssetBundleData 在编辑器中更新资源包信息,确保需要的资产在打包时被正确包含。
然后就是需要开发者配置的对应的四项数据:
- GameFeaturesToEnable 当前配置所需的插件
- DefaultPawnData 定义了玩家使用的角色相关数据,添加const,则角色数据配置不会被动态修改。
- Actions 关卡配置加载完成后进行的一系列的处理,在上面,我们可以看到,是在资源加载完成后,调用了注册,加载和激活。
- ActionSets 一些可以复用的操作集合
接下来,我们在UE里找到对应的资源查看一下,文件所在目录如下
这个是配置射击关卡的一些配置,有时间限制,也有击杀人数限制,只要有一项达到,则会结束游戏。
我们看一下相关配置,GameFeaturesToEnable 是配置所需的插件,以文本定义,我们可以在插件列表里找到对应名称的插件
接着是玩家操作角色的配置,我准备放到下一篇单独讲。
接着看一下操作列表,操作列表里的相关内容,操作配置,首先需要定义此操作的行为,在索引后面选择,选择后,才可以配置相关的数据,来实现功能。
操作是一个数组,而在添加的时候,就会进行实例化,相当于,添加一个其实是添加了一个实例。继承UGameFeatureAction都可以作为选择对象。这也出现了我们设置了对应的类型以后,下面就出现了对应的类的设置方法。
我们接着看一下当前类,里面封装了6个可继承的函数:
- OnGameFeatureRegistering 游戏功能被注册(但尚未激活)时调用,可以用于预加载或初始化逻辑
- OnGameFeatureUnregistering 当游戏功能被取消注册时调用,用于清理或回收资源。
- OnGameFeatureLoading 在游戏功能即将被加载和激活时调用,用于准备激活前所需的资源或设置。
- OnGameFeatureActivating(FGameFeatureActivatingContext& Context); 游戏功能被激活时调用。可以使用上下文参数(Context)传递额外信息。
- OnGameFeatureActivating 游戏功能被激活时调用。老版本重载函数,没有上下文。
- OnGameFeatureDeactivating(FGameFeatureDeactivatingContext& Context) 游戏功能被停用时调用。用于撤销激活期间的设置或释放资源。
/** Game Feature 激活期间需要执行的操作。 */
UCLASS(DefaultToInstanced, EditInlineNew, Abstract)
class GAMEFEATURES_API UGameFeatureAction : public UObject
{GENERATED_BODY()public:/** 当所属的游戏功能被注册(但尚未激活)时调用。可以用于预加载或初始化逻辑。 */virtual void OnGameFeatureRegistering() {}/** 当游戏功能被取消注册时调用。用于清理或回收资源。 */virtual void OnGameFeatureUnregistering() {}/** 在游戏功能即将被加载和激活时调用。用于准备激活前所需的资源或设置。 */virtual void OnGameFeatureLoading() {}/** 游戏功能被激活时调用。主要的执行逻辑在这里实现,可以使用上下文参数(Context)传递额外信息。 */virtual void OnGameFeatureActivating(FGameFeatureActivatingContext& Context);/** 游戏功能被激活时调用。一个老版本的重载方法(无上下文参数) */virtual void OnGameFeatureActivating() {}/** 游戏功能被停用时调用。用于撤销激活期间的设置或释放资源。 */virtual void OnGameFeatureDeactivating(FGameFeatureDeactivatingContext& Context) {}#if WITH_EDITORONLY_DATA/** 在编辑器环境下使用,用于将额外的资产包数据添加到资产包中。 */virtual void AddAdditionalAssetBundleData(FAssetBundleData& AssetBundleData) {}
#endif
};
当前项目里可以添加的有
我们可以在源码里查看对应的类,也可以通过名称搜索
就比如给玩家角色添加技能的操作类,里面覆写了激活和取消激活的函数,然后有个参数设置需要添加的技能,这也是在配置项里选择了此类后,生成实例可设置的内容。
接着,就是关卡配置的最后一项,是操作的集合
这个参数就没什么好讲的了,相对于关卡配置少了两项,只有所需插件和操作,这个理解是为了方便将相应的需求的内容放置到一个操作集里,这样,可以在多个关卡配置里使用。
相关文章:

UE5 Lyra项目源码分析-关卡配置加载
最近刚学完一套教程,准备研究研究官方的源码,看看自己能不能看懂。 当前分析只在本人能力之下能够分析的内容,如果有一些问题,还请大家指出。 开始 如果你打开一个别人的项目,你会从哪里看起,如果是我&am…...

Cursor重置机器码-解决Too many free trials.
参考文章:如何绕过Cursor的机器绑定限制 前言 在前面这篇文章无限使用Cursor指南中,我提到使用 无限邮箱 或者 删除账号并重新注册 的方法,来无限使用Cursor免费版。但是当在本机登录过3个账号后,就会报这个“Too many free tria…...

transformer学习笔记-自注意力机制(2)
经过上一篇transformer学习笔记-自注意力机制(1)原理学习,这一篇对其中的几个关键知识点代码演示: 1、整体qkv注意力计算 先来个最简单未经变换的QKV处理: import torch Q torch.tensor([[3.0, 3.0,0.0],[0.5, 4…...
呼叫中心呼入大模型如何对接传统呼叫中心系统?
呼叫中心呼入大模型如何对接传统呼叫中心系统? 原作者:开源呼叫中心FreeIPCC,其Github:https://github.com/lihaiya/freeipcc 呼叫中心呼入大模型与传统呼叫中心系统的对接是一个复杂而细致的过程,涉及技术实现、流程…...

[Unity] Text文本首行缩进两个字符
Text文本首行缩进两个字符的方法比较简单。通过代码把"\u3000\u3000"加到文本字符串前面即可。 比如: 效果: 代码: TMPtext1.text "\u3000\u3000" "选择动作类型:";...

最新版Chrome浏览器加载ActiveX控件之Adobe PDF阅读器控件
背景 Adobe PDF阅读器控件是一个ActiveX控件,用于在Windows平台上显示和操作PDF文件。它提供了一系列方法和属性,可以实现对PDF文件的加载、显示、搜索、打印、保存等操作。 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件…...
springboot 对接 ollama
spring ai 对接 ollama 引入依赖 <dependency><groupId>io.springboot.ai</groupId><artifactId>spring-ai-ollama-spring-boot-starter</artifactId><version>1.0.0</version> </dependency>这里因为使用的是快照版本所以需…...

【数据库】选择题+填空+简答
1.关于冗余数据的叙述中,不正确的是() A.冗余的存在容易破坏数据库的完整新 B.冗余的存在给数据库的维护增加困难 C.不应该在数据库中存储任何冗余数据 D.冗余数据是指由基本数据导出的数据 C 2.最终用户使用的数据视图称为(&…...

从0开始写android 之xwindow
模拟实现android的窗口系统本质上还是在ubuntu 上实现自己的窗口系统, xwindow是一套成熟的解决方案。在ubuntu上使用xwindow的好处之一 是ubuntu自带xwindow的库, 直接引用头文件和库文件。下面来了解下 xwindow的基本函数接口。 参考 https://tronche…...

The Past, Present and Future of Apache Flink
摘要:本文整理自阿里云开源大数据负责人王峰(莫问)在 Flink Forward Asia 2024上海站主论坛开场的分享,今年正值Flink开源项目诞生的第10周年,借此时机,王峰回顾了Flink在过去10年的发展历程以及 Flink社区…...

多模块应用、发布使用第三方库(持续更新中)
目录: 1、多模块概述(HAP、HSP、HAR) HAR与HSP两种共享包的主要区别体现在: 2、三类模块: 3、创建项目:项目名:meituan (1)创建Ability类型的Module,编译后为HAP文件…...

An error happened while trying to locate the file on the Hub and we cannot f
An error happened while trying to locate the file on the Hub and we cannot find the requested files in the local cache. Please check your connection and try again or make sure your Internet connection is on. 关于上述comfy ui使用control net预处理器的报错问…...

UE5安装Fab插件
今天才知道原来Fab也有类似Quixel Bridge的插件,于是立马就安装上了,这里分享一下安装方法 在Epic客户端 - 库 - Fab Library 搜索 Fab 即可安装Fab插件 然后重启引擎,在插件面板勾选即可 然后在窗口这就有了 引擎左下角也会多出一个Fab图标…...
Linux C语言操作sqlite3数据库
一、环境配置 1、下载源码:sqlite-autoconf-3470200.tar.gz 2、解压,cd到源码主目录 3、配置参数 ./configure --prefix/usr/local/ 如果是交叉编译环境 ./configure CC/opt/rk3288/gcc-linaro/bin/arm-linux-gnueabihf-gcc --hostarm-linux --pre…...
【人工智能】因果推断与数据分析:用Python探索数据间的因果关系
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 因果推断是数据科学领域的一个重要方向,旨在发现变量间的因果关系,而不仅仅是相关性。本篇文章将从因果推断的理论基础出发,介绍因果关系的定义与建模方法,涵盖因果图(Causal Graph)、d-分离、反事实估计等…...
freeswitch(30秒自动挂断)
亲测版本centos 7.9系统–》 freeswitch1.10.9 本人freeswitch安装路径(根据自己的路径进入) /usr/local/freeswitch/etc/freeswitch场景说明: A和B接通通话时候,时间开始计算到达30秒后自动挂断使用方法 进入/usr/local/freeswitch/etc...
大模型呼入机器人有哪些功能特点?(转)
大模型呼入机器人有哪些功能特点?(转) 原作者:开源呼叫中心FreeIPCC,其Github:https://github.com/lihaiya/freeipcc 大模型呼入机器人,作为现代通信技术与人工智能深度融合的产物,正逐渐成为企业提升服务…...

网络工程师常用软件之配置对比软件
「24-配置比对软件-汉化WinMerge」 链接:https://pan.quark.cn/s/cef7541d62d1 ################################################################################ 我们经常在项目或者运维中对设备的config进行变更,那么我们如何快速的知道变更了什么…...

Linux之远程登录
一、使用ssh命令登录 winR打开cmd输入命令 # root是命令,192.168.101.200是地址 ssh root192.168.101.200是否要保存密码,就是yes以后可以免密登录,这里就yes了 输入密码,就登录成功了 操作完成之后,输入命令退出 e…...

#渗透测试#漏洞挖掘#红蓝攻防#js分析(上)
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...