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分析(上)
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...