郑州做网站公司+卓美,wordpress最大上传尺寸,网站开发与维护工资多少,互联网应用技术学什么大家好#xff0c;我是阿赵。 继续学习UE引擎#xff0c;这次来学习一下切换和加载场景的各种做法。
一、 蓝图实现
1、 切换关卡 所谓切换关卡#xff0c;就是从当前关卡进入到一个新的关卡#xff0c; 旧关卡的数据将会被放弃。进入新的关卡后#xff0c;将会执行… 大家好我是阿赵。 继续学习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意思是在场景加载完的时候是否需要显示出来如果勾上那么加载完成后就自动显示了。 如果想后面再显示场景的显示可以这样
通过GetStreamingLevel节点可以找到刚才加载的StreamLevel通过Set Should Be Visible节点可以设置Level是否显示如果想知道某个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 NewObjectULevelStreamingDynamic(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);
}