UE5.2 LyraDemo源码阅读笔记(三)

news2024/9/21 20:27:58

进入淘汰模式游戏流程
启动游戏,进入流程:
1、进入Lyra游戏第三个体验入口FrontEnd。
2、来到大厅主界面后,点击: Play Lyra > Start A Game >ELIMINATION就会进入到淘汰模式游戏。
看看蓝图和代码,其中的UI流程部分先略过吧,直接来到最后的UI ELIMINATION按钮事件:

选择淘汰模式进入游戏。
在这里插入图片描述
然后内部的UI空间会回调用OnExperienceSelected事件节点。
在这里插入图片描述
在这里插入图片描述
ULyraLoadingScreenSubsystem.cpp

...
void ULyraLoadingScreenSubsystem::SetLoadingScreenContentWidget(TSubclassOf<UUserWidget> NewWidgetClass)
{
	if (LoadingScreenWidgetClass != NewWidgetClass)
	{
		LoadingScreenWidgetClass = NewWidgetClass;

		OnLoadingScreenWidgetChanged.Broadcast(LoadingScreenWidgetClass);
	}
}
...

顺便提一个在C++代码查看蓝图引用的方法之一:在方法打断点停止后,先在“调用堆栈”里网上找到xxx.gen.cpp结尾的调用,然后查看“局部变量”里的Stack字段数据,可以看到调用C++的蓝图名称。
在这里插入图片描述

触发蓝图W_HostSessionScreen的HostSession节点,创建请求进入游戏。右键查看其切换关卡C++代码。

在这里插入图片描述
触发请求进入游戏,请求进入关卡数据字段PendingTravelURL=L"/ShooterMaps/Maps/L_Expanse?listen?Experience=B_ShooterGame_Elimination",即淘汰赛地图。
然后,就是又进入LyraGameMode流程了。
然后参数同样传到LyraGameMode.cpp:

void ALyraGameMode::HandleMatchAssignmentIfNotExpectingOne()
{
	...
	UWorld* World = GetWorld();

	if (!ExperienceId.IsValid() && UGameplayStatics::HasOption(OptionsString, TEXT("Experience")))
	{
		const FString ExperienceFromOptions = UGameplayStatics::ParseOption(OptionsString, TEXT("Experience"));
		ExperienceId = FPrimaryAssetId(FPrimaryAssetType(ULyraExperienceDefinition::StaticClass()->GetFName()), FName(*ExperienceFromOptions));
		ExperienceIdSource = TEXT("OptionsString");
	}
	...
}

此时这里的OptionsString值为:L"?listen?Experience=B_ShooterGame_Elimination",因此,将会加载对应的蓝图类B_ShooterGame_Elimination。
关于Loading过场立绘:
点击进入淘汰赛模式时,W_HostSessionScreen图表里执行到PushContentToLayerForPlayer节点,只是先加载一个转圈圈的背景黑色的等待Loading,而真正加载对应的下一关立绘的LoadingUI虽然已经在上面讲过的PrepareToEnterUserFacingExperience设置,还还没真正进行加载和现实。
这个进入淘汰赛新关卡的过场Loading立绘类似的都是在关卡数据资产类DA_Expanse_TDM里设置:
在这里插入图片描述
所以上面PrepareToEnterUserFacingExperience的具体定义里面,就能获取到不同关卡对应的Experience过场立绘引用来设置到C++类ULyraLoadingScreenSubsystem。
接下来是获取过场立绘进行显示,点击进入淘汰赛UI时只是加载了一个带黑色背景遮罩的转圈圈动画。
那么过场立绘是怎么显示出来的呢?要了解这个加载的地方还是有点流程要看懂。
这个流程主要写在了ULoadingScreenManager.cpp。
1、
这个插件的Loading UI加载时通过定时去Tick看有没有内容需要加载,如果有,就显示从
C++类ULoadingScreenManager.cpp的ULoadingScreenManager::ShowLoadingScreen()方法先获取在虚幻编辑器上设置的Loading界面的模板,即
在这里插入图片描述
然后定时ULoadingScreenManager::Tick(float DeltaTime)访问游戏Actor里的模块是否有任何需要显示Loading界面的状态。这里Tick的游戏模块是必须实现了ILoadingProcessInterface接口的ShouldShowLoadingScreen()方法,才具有加载时显示全屏Loading的功能。

可以在ULyraExperienceManagerComponent.cpp打个断点,然后进行选择FrontEnd游戏体验模式,UI上选择PLAY LYRA>START A GAME>ELIMINATION。然后观察断点。(没点到ELIMINATION前出现的断点先跳过),查看一下断点,就会看到调用情况
在这里插入图片描述
这里因为Experience数据资产在加载中,所以返回了true,根据堆栈调用再回到ULoadingScreenManager.cpp,看到方法ULoadingScreenManager::ShowLoadingScreen()里被添加了过场Loading界面,也就是上面编辑器设置的LoadingScrrenWidge,也就是W_LoadingScreen_Host:
在这里插入图片描述
然后来到W_LoadingScreen_Host:
在这里插入图片描述
从而实现了加载时显示DA_Expanse_TMD上设置的立绘:
在这里插入图片描述

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

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

相关文章

dubbo-admin下载安装教程

目录 1.下载 2.项目结构 3.后端打包 4.前端打包 4.1.node js环境准备 4.2.依赖安装 4.3.启动、打包 1.下载 下载地址&#xff1a; GitHub - apache/dubbo-admin at develop dubbo-admin项目有多个分支&#xff0c;最新版本的dubbo-admin在使用go语言进行重构&#xf…

解决电脑提示vcruntime140_1.dll无法继续执行代码的问题

vcruntime140_1.dll丢失要怎么办&#xff1f;其实很多人都在头疼这个问题&#xff0c;关于dll文件的丢失这事情是时常发生的&#xff0c;因为电脑的杀毒软件有时候会误杀&#xff0c;然后就会导致你的游戏程序都打开不了&#xff0c;你必须要修复好了才行&#xff0c;今天小编就…

统计文本中的数字出现频次

统计文本中的数字出现频次&#xff1a;磁盘上有多个文本文件&#xff0c;统计数据写入excel。 (本笔记适合初通 Python 的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教…

AttributeError: module ‘PIL.Image‘ has no attribute ‘ANTIALIAS‘

在使用ddddocr进行图片识别时&#xff0c;报错了&#xff1a; AttributeError: module PIL.Image has no attribute ANTIALIAS 我使用的是Python 3.11&#xff0c;查看一下pillow的版本&#xff1a; print(PIL.__version__)10.0.0 到处百度也没找到原因&#xff0c;最后&am…

IDEA解析Maven依赖过慢

查看Maven配置文件&#xff0c;是否更改为阿里源 maven安装目录/conf/setting.xml 搜索mirrors并在其中添加 <mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/ </url&…

【嘉立创EDA】层次原理图功能使用,或放置复用图块方法

文章路标👉 文章解决问题主题内容小结文章解决问题 1️⃣ 在一些较为复杂的原理图绘制时,常需要使用到复用图块。何为复用图块,笔者摘取ST MB1136设计原理图纸可以较好表述这个功能,如下图所示: [本图摘取自NUCLEO-F103RB设计图纸 sheet 2 of 5] 图中左上角绿色图块为…

探索iPadOS 17的亮点特性:值得关注的新功能揭秘

探索iPadOS 17的亮点特性&#xff1a;值得关注的新功能揭秘 看完在WWDC23上作为久违的“OneMoreThing”亮相的令人兴奋的AppleVisionPro后&#xff0c;是时候看看同样作为重要角色出现在发布会上的iPadOS了。与iOS一样&#xff0c;iPadOS也来到了17时代。除了一年后同步iOS16的…

WinApp自动化测试之WinAppDriver工具简介

前篇文章中&#xff0c;我们讲到了WinApp自动化测试工具的选择&#xff0c;今天我们来简单介绍WinAppDriver工具。 Windows Application Driver (WinAppDriver)是Windows系统上的一个应用程序驱动工具&#xff0c;使用该驱动程序&#xff0c;测试人员能够通过Appium-Python-Cl…

el_table切换行前校验,决定是否可切换

思路&#xff1a;拿到当前点击行并存储比如叫做oldRow&#xff0c;把即将切换行的row与oldRow做对比&#xff0c;校验是否可切换&#xff0c;若校验不可切换&#xff0c;则通过遍历仍选中仍选中oldRow.

python简单实现人脸检测/跟随

import cv2# 加载人脸识别器的模型 face_cascade cv2.CascadeClassifier(cv2.data.haarcascades haarcascade_frontalface_default.xml)# 打开摄像头 cap cv2.VideoCapture(0)# 初始化人脸框位置 prev_faces []# 定义绘制带圆角矩形边框的函数 def draw_rounded_rectangle(…

C语言学习(三十一)---结构体、联合体的在内存中的存储

在上一篇文章中&#xff0c;我们学习了枚举、位段和联合体的相关内容&#xff0c;在文章的末尾&#xff0c;我们还差了关于联合体的存储问题的内容&#xff0c;今天我们将学习该部分的内容&#xff0c;好了&#xff0c;话不多说&#xff0c;开整&#xff01;&#xff01;&#…

TiDB(2):TiDB架构特性

1 TiDB 整体架构 TiDB 集群主要包括三个核心组件&#xff1a;TiDB Server&#xff0c;PD Server 和 TiKV Server。此外&#xff0c;还有用于解决用户复杂 OLAP 需求的 TiSpark 组件和简化云上部署管理的 TiDB Operator 组件。 架构图解 1.1 TiDB Server TiDB Server 负责接收…

20个主流的代码生成LLM大模型及9种常见应用场景

基于生成式AI的代码生成&#xff08;Code Generation&#xff09;是一个重要的新领域&#xff0c;用于根据不完整的数据源、用另一种编程语言编写的程序、自然语言描述或执行日志来预测代码或程序结构。 多年来&#xff0c;开发人员经常从博客、帖子、文章和其他网站获取代码&…

vue引用百度地图,drawingManager.setDrawingMode不能接受参数,否则会报错

直接上部分代码&#xff1a; 引用百度地图后&#xff0c;没报错&#xff0c;但是鼠标绘制线路时报错&#xff1a; // 绘制点线 this.drawingManager new window.BMapLib.DrawingManager(this.map, { isOpen: true, //是否开启绘制模式 //enableDrawingTool: true, //是否显示…

数据结构 | 线索二叉树

一、数据结构定义 /* 线索二叉树 */ typedef char ThreadType; typedef struct ThreadNode {ThreadType data;struct ThreadNode* lchild, * rchild;int ltag, rtag; //左右线索标志 }ThreadNode, *ThreadTree; 二、方法概览 ThreadTree createTree(); //先序方法创建二叉树…

==和equals的区别

“”和equals 最大的区别是 “”是运算符&#xff0c;如果是基本数据类型&#xff0c;则比较存储的值&#xff1b;如果是引用数据类型&#xff0c;则比较所指向对象的地址值。equals是Object的方法&#xff0c;比较的是所指向的对象的地址值&#xff0c;一般情况下&#xff0c…

Jvisualvm内存模型剖析-JVM(五)

上篇文章代码讲解了tomcat加载以及gc回收流程。 Jvm内存模型剖析优化-JVM&#xff08;四&#xff09; Jvisualvm 我们可以编写如上代码&#xff0c;之后打开jvm自带的工具jvisualvm。 如果我们看visual不会明显变化&#xff0c;则可以修改睡眠参数&#xff0c;时间改小。 当…

【MySQL】根据MVCC和Read View分析事务的四种隔离级别在读写场景分别是如何体现其隔离性的

目录 一、数据库并发的三种场景 二、读写场景的MVCC 1、3个&#xff08;4个&#xff09;记录隐藏列字段 2、undo log&#xff08;撤销日志&#xff09; 3、模拟MVCC场景 3.1update场景 3.2delete场景 3.3insert 3.4select场景 4、Read View 5、RR和RC的区别 5.1当…

Squid 代理服务器应用

目录 一、Squid 概念1.1 代理的工作机制1.2 代理服务器的作用1.3 Squid 代理的类型 二、安装 Squid 服务2.1 编译安装 Squid2.2 修改 Squid 的配置文件2.3 Squid 的运行控制2.4 创建 Squid 服务脚本 三、构建传统代理服务器四、构建透明代理 服务器五、ACL 访问控制六、 日志分…

Python——模块与包

一、模块 &#xff08;1&#xff09;模块的定义 模块——Modules,通常一个py文件就是一个模块&#xff0c;我们在一个py文件里面会定义多个函数&#xff0c;也就是说一个模块中可以包含N多个函数。 &#xff08;2&#xff09;模块化编程的好处 ①方便其他程序和脚本的导入并使用…