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

阿赵UE引擎C++编程学习笔记——场景加载和切换

  大家好,我是阿赵。
  继续学习UE引擎,这次来学习一下切换和加载场景的各种做法。

一、 蓝图实现

1、 切换关卡

  所谓切换关卡,就是从当前关卡进入到一个新的关卡, 旧关卡的数据将会被放弃。进入新的关卡后,将会执行新关卡的关卡蓝图和GameMode的生命周期。
  在蓝图里面切换关卡,使用Open Level节点:
在这里插入图片描述

在这里插入图片描述

2、 加载关卡实例

  加载关卡和切换关卡不一样的地方是,原有的关卡并不会被卸载,而是把新的关卡直接加入到旧的关卡当中。然后生命周期还是走的原有关卡,新关卡只是用于加载资源。
  UE里面似乎没有像Unity引擎的DontDestroyOnLoad的处理,所以如果用Open Level切换关卡,旧关卡的资源和代码都会被卸载掉,然后如果有一些需要持续运行的东西,比如逻辑和背景音乐之类,也会被中断。
  所以我们可以保持一个一直存在的Level作为基础逻辑和资源,然后把需要的关卡通过关卡实例加载进来,不用的时候再卸载掉。
  加载关卡实例可以用节点Load Level Instance,可以通过对象引用或者名字来加载。名字就是Level本身的文件名,比如我这里要加载Level2场景,就直接填Level2就行。
在这里插入图片描述

在这里插入图片描述

  这个方法会返回是否加载成功,还有会返回加载后的Level对象,可以用于后续的控制:
在这里插入图片描述
在这里插入图片描述

  比如我要按一个按键来卸载这个Level,就可以拿到这个返回值,再获取Package FName,就可以卸载了:
在这里插入图片描述

3、 通过流读取关卡

  区别于上面第2种方法,通过StreamLevel来加载场景,必须先把场景设置到Level里面。这是因为,一个主关卡可以添加很多个子关卡,这些子关卡可以设置成并不是一开始就加载,而是有需要的时候才加载显示。而很多个子关卡组成一个大关卡,就能实现超大型地图场景了。
  接下来看看怎样添加子场景。比如我要把Level2场景作为Level1场景的子场景,那么我们应该打开Level1场景,然后再去窗口——>关卡,打开关卡面板:
在这里插入图片描述

  然后把Level2拖动到关卡面板
在这里插入图片描述

  然后把Level2的修改流送方法改成蓝图:
在这里插入图片描述

  设置好了之后,通过Load Stream Level节点,就可以加载子场景了。可以通过引用或者场景名称来加载。如果没有上面的设置,加载的时候会报错说找不到该名字的流场景。
在这里插入图片描述
在这里插入图片描述

  这里有个设置叫做Make Visible After Load,意思是在场景加载完的时候,是否需要显示出来,如果勾上,那么加载完成后,就自动显示了。
在这里插入图片描述

  如果想后面再显示场景的显示,可以这样:

  1. 通过GetStreamingLevel节点,可以找到刚才加载的StreamLevel
  2. 通过Set Should Be Visible节点,可以设置Level是否显示
  3. 如果想知道某个Level当前是否显示,可以用is Level Visible节点来查看
    在这里插入图片描述

所以就可以这样:
在这里插入图片描述

二、 C++实现

1、 切换关卡

和蓝图的OpenLevel节点相同,都是加载新场景放弃就场景,调用如下:
UGameplayStatics::OpenLevel(GetWorld(), “Level2”);

2、 通过StreamLevel加载

这个和蓝图的Load Stream Level节点功能基本一致,也是需要先去关卡面板把子场景添加好,才能正常加载:
加载

FString fileName = TEXT("Level2");
FLatentActionInfo info;
UGameplayStatics::LoadStreamLevel(GetWorld(), *fileName, true,false,info);

卸载

FLatentActionInfo info;
FString fileName = TEXT("Level2");
UGameplayStatics::UnloadStreamLevel(GetWorld(), *fileName, info, false);

控制

FString fileName = TEXT("Level2");
ULevelStreaming* curLevel = UGameplayStatics::GetStreamingLevel(GetWorld(), *fileName);
if (curLevel == nullptr)
{return;
}
bool isVisible = curLevel->IsLevelVisible();
curLevel->SetShouldBeVisible(not isVisible);

3、 按路径加载Level

如果不想先设置子Level,而直接按照路径加载某个场景资源,可以这样:
加载

ULevelStreamingDynamic* StreamingLevel;FString path = TEXT("/Game/Level/Level3");
FLatentActionInfo info;
StreamingLevel = NewObject<ULevelStreamingDynamic>(GWorld, ULevelStreamingDynamic::StaticClass(), NAME_None, RF_Public, NULL);
StreamingLevel->SetWorldAssetByPackageName(*path);
GetWorld()->AddStreamingLevel(StreamingLevel);
StreamingLevel->SetShouldBeLoaded(true);
StreamingLevel->SetShouldBeVisible(true);

控制和移除
需要自己保存之前加载的StreamingLevel,接下来可以控制该Level的显示隐藏或者卸载移除都可以

if (StreamingLevel != nullptr)
{
StreamingLevel->SetIsRequestingUnloadAndRemoval(true);
}
http://www.lryc.cn/news/376395.html

相关文章:

  • 【LLM之RAG】RAFT论文阅读笔记
  • 【Android】使用Binder(AIDL)实现利用自定义Bean进行的进程间通信(二)
  • HTTP中get与post的区别?在传输数据类型上有什么区别?【面试】
  • 「51媒体-年中大促」天津有哪些媒体资源-媒体宣传服务公司
  • Thinkphp校园新闻发布系统源码 毕业设计项目实例
  • 前端老古董execCommand——操作 选中文本 样式
  • elementui写一个自定义的rangeInput的组件
  • 护眼灯哪些牌子好?一文刨析护眼灯怎么选择!
  • 抖音短剧看剧系统是怎么做的?怎么样搭建上线运营?
  • 2024.06.06校招 实习 内推 面经
  • 神经网络模型---ResNet
  • Linux之网络编程
  • opencascade AIS_InteractiveContext源码学习1
  • TIA博途 WinCC下载到面板时,提示错误消息:“装载过程终止由于传输错误:8020AB001A06FFF4!”的解决办法
  • 【MySQL】聊聊数据库是如何保证数据不丢的
  • GitLab教程(四):分支(branch)和合并(merge)
  • 2021数学建模A题目–“FAST”主动反射面的形状调节
  • 华为---- RIP路由协议基本配置
  • Android studio在Ubuntu桌面上 创建桌面图标,以及导航栏图标
  • JAVA云HIS医院管理系统源码 云HIS系统的应用场景
  • Handler机制
  • 鸿蒙实现金刚区效果
  • Ubuntu 查看设备温度
  • 大型网站优化指南:打造流畅的在线体验
  • Redis变慢了?
  • 11.6.k8s实战-节点扩缩容
  • 相亲交友APP系统|婚恋交友社交软件|语音聊天平台定制开发
  • 2005-2022年款福特福克斯维修手册和电路图线路图接线图资料更新
  • nodejs爬取小红书图片
  • MySQL从5.7升级到8.0步骤及其问题