[unreal] 切换关卡

本文探讨了Unreal引擎中的关卡切换方法,对比了OpenLevel与LoadStreamLevel的使用方式及性能表现,并解决了流关卡切换时gamemode无法切换的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        最近开始研究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代码中。

### 使用传送门实现在 Unreal Engine 5切换关卡Unreal Engine 5 (UE5) 中实现通过传送门切换关卡的功能涉及多个方面的工作,包括但不限于创建传送门机制、处理不同关卡之间的转换逻辑以及确保玩家重生点的准确性。 #### 创建基础传送门结构 为了建立基本的传送门框架,在场景编辑器中放置两个立方体作为视觉上的“入口”和“出口”。这两个物体应该被赋予碰撞组件以便检测玩家何时接近它们。对于更复杂的项目来说,可能还需要考虑使用蓝图脚本来控制这些行为[^1]。 ```cpp // C++ 示例:为传送门添加触发事件 void ATeleportDoor::BeginPlay() { Super::BeginPlay(); // 假设 TriggerVolume 是指定了触发区域的一个 Box Collision 组件 if(TriggerVolume != nullptr){ TriggerVolume->OnComponentBeginOverlap.AddDynamic(this, &ATeleportDoor::OnOverlapBegin); } } ``` #### 编写蓝图逻辑以支持跨地图旅行 当玩家触碰其中一个传送门时,应启动一个序列来改变当前的游戏世界并重新定位玩家的位置。这可以通过调用 `Open Level` 节点完成,并指定目标级别名称;同时传递额外参数如 `bUseStreaming` 设置为 true 来启用异步加载特性[^2]。 ![Blueprint Logic](https://example.com/blueprint_logic.png) - **设置出生点**:根据所选目的地调整玩家初始坐标与方向。此过程可以在接收端的地图内部署特定的 Actor 或者利用 UE 的默认机制——即 Player Start Actors 定义新位置[^3]。 - **保存状态数据**:如果希望保持某些属性不变(比如生命值、装备等),则需设计一套方案用于存储并在必要时刻恢复这类信息。 #### 地形与其他环境要素准备 考虑到无缝过渡的需求,预先规划好各张地图间的连接方式至关重要。特别是涉及到大型开放世界的开发时,合理运用 Landscape 工具集可以帮助塑造连贯的地貌特征,减少因视角突然转变带来的割裂感[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值