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

[unreal] 切换关卡

[unreal] 切换关卡

https://blog.csdn.net/ZJU_fish1996/article/details/79222733

最近开始研究unreal里的关卡切换,中途绕了不少弯路,特此记录一下。

        一开始我一直按照unity中的场景来理解关卡。后来发现这两者并不是完全对等的,关卡更像是一个区域,所以一个场景里有多个关卡也是合理的。

        1.OpenLevel

        一开始使用了一个OpenLevel的接口。

        (1) 在蓝图中,直接搜索,拖拽出来即可,一般情况下只需要填一个参数:关卡的名称。不需要带路径。

      

        (2) 在代码中,该函数是UGameplayStatics类里的一个静态函数,具体定义如下:

          

     头文件为:#include "Kismet/GameplayStatics.h"

     先试着用了一下这个接口,功能正常,但是有一个严重的问题,速度特别慢,我的场景有一点复杂,加载时间就花费了40多秒,这是无法忍受的。所以我就开始寻找有没有后台异步加载场景的接口。

      2.LoadStreamLevel

     后来我又找到了一个满足要求的接口LoadStreamLevel。

     (1) 在蓝图中,右键搜索即可拉出该接口:

     

         这里有两个可勾选的参数,可由名字直接看出它的含义,在这里,根据需求,我勾选了加载完成后显示,以及加载过程中堵塞(此时用户只能等待过图)。

     (2) 在代码中,这个函数同样定义在UGameplayStatics类里(还有一个对应的Unload版本)

       

       开始用这个接口没有任何反应,一直搞不清楚是哪里的问题,后来无意中发现要实现流关卡切换,首先要把所有需要的关卡都放到关卡编辑器中,而OpenLevel则是不需要的。

       具体可在菜单栏-窗口中点击关卡(level),在弹出的界面中,选择Add existing来添加已存在的关卡。

        

     此时场景中会显示所有关卡,可以点左边的眼睛来控制显隐。这时候,场景就基本在3秒内加载完毕了。

     实际上可以看出,所有可以切换的流关卡都是作为永久性关卡的子关卡存在的。


        3.关于gamemode

        gamemode,也就是游戏模式,在这里我们可以指定这个游戏的基本属性。

        我这里有一个比较特殊的情况,就是我使用了一个插件,这个插件有着自己的一套gamemode,我又额外做了一个关卡,用了另一套gamemode,现在需要在这两个关卡中做一个切换。

        在使用loadlevel接口的时候,这个切换毫无问题,我只需要在世界设置界面,给第一个关卡设置一个gamemode,再打开另外一个关卡,重新设置一个gamemode就可以了。但是改用了loadstreamlevel后,gamemode就无法切换了,哪怕我在虚幻编辑器中动态修改也没有反应。在这一块我查了大量资料,才确认了一个事实:

        在unreal中,一个关卡只能对应一个gamemode。

        从某种程度上来说,这是合理的,每个世界都有着它特有的规则,如果存在两套规则,就会发生混乱。

        而对于loadstreamlevel而言,其他的关卡是作为子关卡而存在的,所以实际上它们依然被认为是一个关卡整体,这整个关卡的gamemode,取决于根关卡,也就是永久性关卡的gamemode。

        最后的解决方案,就只能魔改插件代码再编译,强行把我的gamemode逻辑塞进了插件的gamemode代码中。
————————————————
版权声明:本文为CSDN博主「ZJU_fish1996」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ZJU_fish1996/article/details/79222733

 

 

 

 

相关文章:

  • [UE4]GameInstance初始化
  • [UE4]性能优化指南(程序向)
  • vscode lua 插件
  • UE4-【C++】【打包NonUASSET文件并加载】
  • ue4-混合动画及动画状态机
  • [UE4]Montage动画设置Slot
  • Lua5.1 升级 Lua5.3 升级 小结
  • Jenkins 设置
  • Jenkins节点配置
  • Jenkins子节点构建配置
  • Python3 * 和 ** 运算符
  • perforce 获取本地最近更新的Changelist
  • jenkins--slave节点
  • shell 脚本中set-x 与set+x的区别
  • 学习笔记: shell 中的 set -e , set +e 用法
  • angular学习第一篇-----环境搭建
  • avalon2.2的VM生成过程
  • classpath对获取配置文件的影响
  • conda常用的命令
  • ES10 特性的完整指南
  • es6
  • HTML-表单
  • Invalidate和postInvalidate的区别
  • Java 最常见的 200+ 面试题:面试必备
  • MD5加密原理解析及OC版原理实现
  • php的插入排序,通过双层for循环
  • 动态规划入门(以爬楼梯为例)
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 离散点最小(凸)包围边界查找
  • 怎样选择前端框架
  • ionic异常记录
  • 积累各种好的链接
  • !$boo在php中什么意思,php前戏
  • # 飞书APP集成平台-数字化落地
  • #pragma 指令
  • $.ajax()方法详解
  • (2)STM32单片机上位机
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (转)重识new
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .Net Core缓存组件(MemoryCache)源码解析
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • /boot 内存空间不够
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [20160807][系统设计的三次迭代]
  • [2023年]-hadoop面试真题(一)
  • [AIGC] MySQL存储引擎详解
  • [Android]How to use FFmpeg to decode Android f...
  • [BJDCTF2020]The mystery of ip
  • [C#C++]类CLASS
  • [C++]模板与STL简介
  • [cogs2652]秘术「天文密葬法」
  • [CSS]盒子模型
  • [EULAR文摘] 脊柱放射学持续进展是否显著影响关节功能
  • [Jquery] 实现温度计动画效果