Lyra学习笔记1地图角色加载流程

目录

  • 1 地图加载流程
    • 1.1 默认Experience的加载
    • 1.2 加载角色
    • 1.3 加载场景中的几个传送点
  • 2 几个内建类的笔记
    • 2.1 UDataAsset
    • 2.2 UAssetManager

纯个人笔记,有错误欢迎指正,学习阶段基本看到不会的就写一写,最后有时间会梳理整体结构

先看完了官方的演讲

1 地图加载流程

1.1 默认Experience的加载

  这里先不从GameInstance开始,中间的CommonUser等流程暂时不谈(有点多暂时不想看0w0),编辑器默认地图L_DefaultEditorOverview中没有重载游戏模式,所以用项目默认的B_LyraGameMode。
  ALyraGameMode::InitGame()

// Wait for the next frame to give time to initialize startup settings
GetWorld()->GetTimerManager().SetTimerForNextTick(this, &ThisClass::HandleMatchAssignmentIfNotExpectingOne);

可见逻辑转到了ALyraGameMode::HandleMatchAssignmentIfNotExpectingOne()
(这里走的默认分支)

void ALyraGameMode::HandleMatchAssignmentIfNotExpectingOne()
{...ExperienceId = FPrimaryAssetId(FPrimaryAssetType("LyraExperienceDefinition"), FName("B_LyraDefaultExperience"));ExperienceIdSource = TEXT("Default");...OnMatchAssignmentGiven(ExperienceId, ExperienceIdSource);
}

  之后的调用栈大概是

OnMatchAssignmentGiven(ExperienceId, ExperienceIdSource)->
void ULyraExperienceManagerComponent::SetCurrentExperience(ExperienceId)->
void ULyraExperienceManagerComponent::StartExperienceLoad()->
void ULyraExperienceManagerComponent::OnExperienceLoadComplete()

  过程大体是设置当前ExperienceId,异步加载Experience相关资源,调用加载完成的回调.
  OnExperienceLoadComplete()函数收集GameFeaturePluginURL,最终调用

UGameFeaturesSubsystem::Get().
LoadAndActivateGameFeaturePlugin(PluginURL,  
FGameFeaturePluginLoadComplete::CreateUObject(this, 
&ThisClass::OnGameFeaturePluginLoadComplete));

  触发默认Feature的Action

这里记录一下几个Action函数的调用顺序, 防止我忘了
在这个函数中:
void ULyraExperienceManagerComponent::OnExperienceFullLoadCompleted()

ActivateListOfActions的定义

	auto ActivateListOfActions = [&Context](const TArray<UGameFeatureAction*>& ActionList){for (UGameFeatureAction* Action : ActionList){if (Action != nullptr){//@TODO: The fact that these don't take a world are potentially problematic in client-server PIE// The current behavior matches systems like gameplay tags where loading and registering apply to the entire process,// but actually applying the results to actors is restricted to a specific worldAction->OnGameFeatureRegistering();Action->OnGameFeatureLoading();Action->OnGameFeatureActivating(Context);}}};

逐一调用顺序
自己的Actions先调用,再遍历调用ActionSets

ActivateListOfActions(CurrentExperience->Actions);for (const TObjectPtr<ULyraExperienceActionSet>& ActionSet : CurrentExperience->ActionSets){if (ActionSet != nullptr){ActivateListOfActions(ActionSet->Actions);}}

三个多播顺序

	OnExperienceLoaded_HighPriority.Broadcast(CurrentExperience);OnExperienceLoaded_HighPriority.Clear();OnExperienceLoaded.Broadcast(CurrentExperience);OnExperienceLoaded.Clear();OnExperienceLoaded_LowPriority.Broadcast(CurrentExperience);OnExperienceLoaded_LowPriority.Clear();

1.2 加载角色

B_LyraDefaultExperience中:
在这里插入图片描述
SimplePawnData:
在这里插入图片描述
可以发现通过这个就找到了创建的金属Pawn,而不是GameMode中的角色类(是其蓝图子类)
在这里插入图片描述
但是为什么这里的配置能够生效呢?
因为ALyraGameMode重写了这个实现:

APawn* ALyraGameMode::SpawnDefaultPawnAtTransform_Implementation(AController* NewPlayer, const FTransform& SpawnTransform){
...
if (UClass* PawnClass = GetDefaultPawnClassForController(NewPlayer)){if (APawn* SpawnedPawn = GetWorld()->SpawnActor<APawn>(PawnClass, SpawnTransform, SpawnInfo))
...
}UClass* ALyraGameMode::GetDefaultPawnClassForController_Implementation(AController* InController)
{if (const ULyraPawnData* PawnData = GetPawnDataForController(InController)){if (PawnData->PawnClass){return PawnData->PawnClass;}}
...
}const ULyraPawnData* ALyraGameMode::GetPawnDataForController(const AController* InController) const
{
...
return Experience->DefaultPawnData;
...
}

1.3 加载场景中的几个传送点

由场景中这个Actor控制:
在这里插入图片描述
生成逻辑没什么该注意的,注意生成时传入了LyraUserfacingExperienceDefinition类型的变量,Widget信息都是根据这个配置的。
主要看加载地图:
在这里插入图片描述
可见信息都在LyraUserfacingExperienceDefinition中,例如这个下边这个,可以看到
要去的地图信息都有。
在这里插入图片描述

2 几个内建类的笔记

2.1 UDataAsset

刚拿到项目无从下手,就去看了启动默认地图L_LyraFrontEnd,没有重载GameMode,即用的项目设置的B_LyraGameMode,暂时先不看GameMode,然后基于演讲去看了DefaultGameplayExperience,一路看过去

B_LyraFrontEnd_Experience->
ULyraExperienceDefinition->
UPrimaryDataAsset->
UDataAsset->
UObject

这时候我发现我对DataAsset没什么了解,只好先去学习一下:

UCLASS(abstract, MinimalAPI, Meta = (LoadBehavior = "LazyOnDemand"))
class UDataAsset : public UObject

abstract:

在这里插入图片描述
MinimalAPI没太看懂,大概是优化编译相关的:
在这里插入图片描述
LoadBehavior
UPrimaryDataAsset:
UE5–PrimaryDataAsset资产包更新UpdateAssetBundleData源码分析
看完这几篇后我的理解这个类就是数据资产。


2.2 UAssetManager

暂时停留在使用层理解。
UE5 AssetManager类使用详解


参考文章:
UE5 Lyra项目学习(零) 开篇&目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/82027.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SurfaceFlinger及Android应用RenderThread角度观察Jank丢帧卡顿

SurfaceFlinger及Android应用RenderThread角度观察Jank丢帧卡顿 CPU、GPU、Display 三个部分&#xff1a;CPU 负责计算帧数据&#xff0c;把计算好的数据交给 GPU&#xff0c;GPU 会对图形数据进行渲染&#xff0c;渲染好后放到 buffer &#xff08;图像缓冲区&#xff09;存起…

《牛客》数组中出现次数超过一半的数字

牛客的刷题之路不停歇 ⌓‿⌓ 不积跬步无以至千里&#xff0c;不积小流无以成江海 The harder you work,the luckier you will be 题目及示例 题目链接 描述 给一个长度为 n 的数组&#xff0c;数组中有一个数字出现的次数超过数组长度的一半&#xff0c;请找出这个数字。 例…

七彩喜康养护理——科技赋能下的全周期健康守护

在当今社会&#xff0c;随着人们健康意识的不断提高&#xff0c;护理行业逐渐走向专业化、精细化&#xff0c;而七彩喜智养护理作为一种新兴的护理方式&#xff0c;逐渐受到了广泛的关注和应用。 它不仅仅是针对单一病症的治疗护理&#xff0c;而是一种全面的、全方位的健康管…

【爬虫】12306自动化购票

上文&#xff1a; 【爬虫】12306查票-CSDN博客 下面是简单的自动化进行抢票&#xff0c;只写到预定票&#xff0c;没有写完登陆&#xff0c; 跳出登陆后与上述代码同理修改即可。 感觉xpath最简单&#xff0c;复制粘贴&#xff1a; 还有很多写法&#xff1a; 官网地址&#…

Java设计模式之组合模式:从入门到精通(保姆级教程)

文章目录 1. 组合模式概述1.1 专业定义1.2 通俗解释1.3 模式结构2. 组合模式详细解析2.1 模式优缺点2.2 适用场景3. 组合模式实现详解3.1 基础实现3.2 代码解析4. 组合模式进阶应用4.1 透明式 vs 安全式组合模式4.2 组合模式与递归4.3 组合模式与迭代器5. 组合模式在实际开发中…

游戏如何应对反编译工具dnspy

Unity Mono 是 Unity 引擎默认的脚本运行时环境&#xff0c;由跨平台的开源 .NET 框架实现&#xff0c;它允许开发者使用 C# 等编程语言编写游戏逻辑&#xff0c;凭借简单易用的开发环境和高效的脚本编译速度&#xff0c;得到了众多游戏的青睐。 在 Mono 模式下&#xff0c;游…

腾讯云证书过期提醒的应对措施,Caddy 自动管理的 Let‘s Encrypt 证书.

用腾讯的免费证书&#xff0c;90天需要换一次。 Caddy 自动管理的 Lets Encrypt 证书. 在网站上按F12然后找到security选项&#xff0c;然后选择View certifcate 就可以看到证书的有效期。 完全无需操作 你的网站实际使用的是 Caddy 自动管理的 Lets Encrypt 证书&#xff0c;…

[Java实战]Spring Boot整合Elasticsearch(二十六)

[Java实战]Spring Boot整合Elasticsearch&#xff08;二十六&#xff09; 摘要&#xff1a;本文通过完整的实战演示&#xff0c;详细讲解如何在Spring Boot项目中整合Elasticsearch&#xff0c;实现数据的存储、检索和复杂查询功能。包含版本适配方案、Spring Data Elasticsea…

【关联git本地仓库,上传项目到github】

目录 1.下载git2.绑定用户3.git本地与远程仓库交互4.github项目创建5.上传本地项目到github6.完结撒花❀❀❀&#xff01;&#xff01;&#xff01; 1.下载git git下载地址&#xff1a;https://git-scm.com/downloads 下载安装后创建快捷地址&#xff1a;&#xff08;此处比较…

[Vue]路由基础使用和路径传参

实际项目中不可能就一个页面&#xff0c;会有很多个页面。在Vue里面&#xff0c;页面与页面之间的跳转和传参会使用我们的路由: vue-router 基础使用 要使用我们需要先给我们的项目添加依赖:vue-router。使用命令下载: npm install vue-router 使用路由会涉及到下面几个对象:…

软考-软件工程开发模型

软考-软件工程开发模型 参考视频&#xff1a; 软件工程概述&开发模型 &#xff0c;配合视频理解更清晰&#xff5e; 软件的生命周期为&#xff1a;需求分析、软件设计、软件开发、运行维护直至被淘汰 几个阶段。 软件工程支持 4 个活动&#xff0c;简称 PDCA&#xff0c…

【写在创作纪念日】基于SpringBoot和PostGIS的各省东西南北四至极点区县可视化

目录 前言 一、空间检索简介 1、空间表结构 2、四至空间检索 二、前后端实现 1、后端实现 2、前端集成 三、成果展示 1、东部省份 2、西部省份 3、南部省份 4、北部省份 5、中部省份 四、总结 前言 在当今数字化时代&#xff0c;地理信息数据的分析与可视化对于众…

智能守护校园“舌尖安全“:AI视频分析赋能名厨亮灶新时代

引言&#xff1a; 在校园食品安全备受关注的今天&#xff0c;一套融合视频监控管理平台与AI视频分析盒子的智能解决方案正在全国多地学校食堂悄然落地&#xff0c;为传统的"名厨亮灶"工程注入科技新动能。这套系统不仅实现了后厨操作的"透明化"&#xff0…

【软件设计师】计算机网络考点整理

以下是软件设计师考试中 ​​计算机网络​​ 的核心考点总结&#xff0c;帮助您高效备考&#xff1a; ​​一、网络体系结构与协议​​ ​​OSI七层模型 & TCP/IP四层模型​​ 各层功能&#xff08;物理层-数据链路层-网络层-传输层-会话层-表示层-应用层&#xff09;对应协…

Starrocks的CBO基石--统计信息的来源 StatisticAutoCollector

背景 本文来从底层代码的实现来分析一下Starrocks怎么获取统计信息&#xff0c;这些统计信息在后续基于CBO的代价计算的时候有着重要的作用 本文基于Starrrocks 3.3.5 结论 Starrocks的统计信息的收集是通过周期性的运行一系列的SQL&#xff08;以分区为维度&#xff0c;如果…

深度学习模型部署(四)——RKNN

一、RKNN部署及工具包安装 参考1&#xff1a;https://blog.csdn.net/qq_40280673/article/details/136211086#/ 参考2&#xff1a;瑞芯微官方教程 RKNN部署针对瑞芯微芯片优化&#xff0c;支持NPU硬件加速&#xff0c;需要安装rknn-toolkit&#xff0c;用于将pytorch模型转换为…

重构研发效能:项目管理引领软件工厂迈向智能化

1.项目管理智能化&#xff0c;激活软件工厂新引擎 在高速发展的软件开发时代&#xff0c;企业如何高效管理多个项目、协调团队合作、优化资源配置&#xff0c;已成为推动技术进步的关键。尤其是在多任务、多项目并行的复杂环境下&#xff0c;智能项目组合管理工具正成为软件工…

小米汽车二期工厂下月将竣工,产能提升助力市场拓展

在新能源汽车市场竞争日益激烈的当下&#xff0c;小米汽车传来重要进展消息。据多方信息显示&#xff0c;小米汽车二期工厂下月即将竣工&#xff0c;这一关键节点的到来&#xff0c;有望为小米汽车的产能提升与市场布局带来重大突破。​ 小米汽车二期工厂位于北京亦庄&#xff…

Python 爬虫实战:电竞比赛直播数据实时抓取与可视化分析

一、引言 在电竞行业快速发展的今天,电竞比赛直播数据成为了电竞爱好者、分析师和商业机构关注的焦点。实时抓取电竞比赛直播数据并进行分析,不仅可以帮助观众更好地理解比赛,还能为战队战术优化、选手表现评估以及赛事运营提供重要参考。 本文将详细介绍如何使用Python爬…

零基础设计模式——创建型模式 - 生成器模式

第二部分&#xff1a;创建型模式 - 生成器模式 (Builder Pattern) 前面我们学习了单例、工厂方法和抽象工厂模式&#xff0c;它们都关注如何创建对象。生成器模式&#xff08;也常被称为建造者模式&#xff09;是另一种创建型模式&#xff0c;它专注于将一个复杂对象的构建过程…