使用虚幻引擎(UE5)实现Actor携带过关卡功能(附完整工程源码)
引言: 在虚幻引擎中,每个关卡都被视作一个独立的世界,即UWorld类型。这些世界遵循各自的规则,尽管不同关卡可能共享相似的规则,但它们并不是同一套规则。这有点像不同国家虽然有相似的法律,如都将盗窃视为犯罪,但各自的法律体系是独立的。
虚幻引擎设计了一种机制,即在任一时刻,只允许一个世界(关卡)存在。因此,当我们从一个关卡移动到另一个时,当前关卡的对象会被销毁,新关卡的对象与旧关卡的对象是相互独立的。
那么,有没有办法将对象从一个关卡带到另一个关卡呢?答案是肯定的!这需要利用虚幻引擎提供的无缝漫游功能。
注意:无缝漫游功能无法直接通过蓝图实现,必须借助C++代码。
操作步骤: 1、启用无缝漫游功能,这需要在游戏模式的代码中进行设置,或者通过游戏模式的蓝图面板进行配置(两者选择其一)。
ACarryThroughGameModeBase::ACarryThroughGameModeBase()
{
//应用无缝漫游 Gamemode构造函数中设置
bUseSeamlessTravel =
true
;
}
或是在面板中设置
2、C++中Gamemode重写父类GetSeamlessTravelActorList函数
virtual void GetSeamlessTravelActorList(bool bToTransition, TArray<AActor*>& ActorList) override;
大家需要注意,此函数在切换关卡使用无缝漫游时会被调用,调用时,需要将漫游过关卡的Actor添加到参数ActorList中,即可将Actor携带过关。
实现代码参照
void
ACarryThroughGameModeBase::GetSeamlessTravelActorList(
bool
bToTransition, TArray<AActor*>& ActorList)
{
//需要优先调用,蓝图传入会覆盖ActorList
K2_GetSeamlessTravelActorList(ActorList);
//将自身存储数组数据追加到List数组中
ActorList.Append(TravelActorList);
//必须调用父类函数
Super::GetSeamlessTravelActorList(bToTransition, ActorList);
}
其中K2_GetSeamlessTravelActorList是我添加的函数,用于向蓝图暴露,蓝图可重写,函数声明如下
UFUNCTION(BlueprintImplementableEvent, DisplayName=
"GetSeamlessTravelActorList"
)
void
K2_GetSeamlessTravelActorList(TArray<AActor*>& ActorList);
TravelActorList是我在GameMode中添加的用来存储保存过关Actor的数组。
ACarryThroughGameModeBase.h源码
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "CarryThroughGameModeBase.generated.h"
/**
*
*/
UCLASS()
class
CARRYTHROUGH_API ACarryThroughGameModeBase :
public
AGameModeBase
{
GENERATED_BODY()
ACarryThroughGameModeBase();
protected
:
virtual
void
GetSeamlessTravelActorList(
bool
bToTransition, TArray<AActor*>& ActorList)
override
;
UFUNCTION(BlueprintCallable)
void
AddTravelActorList(AActor* Actor);
UFUNCTION(BlueprintImplementableEvent, DisplayName=
"GetSeamlessTravelActorList"
)
void
K2_GetSeamlessTravelActorList(TArray<AActor*>& ActorList);
protected
:
UPROPERTY()
TArray<AActor*> TravelActorList;
};
#include "CarryThroughGameModeBase.h"
ACarryThroughGameModeBase::ACarryThroughGameModeBase()
{
//应用无缝漫游
bUseSeamlessTravel =
true
;
}
void
ACarryThroughGameModeBase::GetSeamlessTravelActorList(
bool
bToTransition, TArray<AActor*>& ActorList)
{
//需要优先调用,蓝图传入会覆盖ActorList
K2_GetSeamlessTravelActorList(ActorList);
//将自身存储数组数据追加到List数组中
ActorList.Append(TravelActorList);
//必须调用父类函数
Super::GetSeamlessTravelActorList(bToTransition, ActorList);
}
void
ACarryThroughGameModeBase::AddTravelActorList(AActor* Actor)
{
TravelActorList.Add(Actor);
}
蓝图中重写函数截图
BP_Gaemode继承自ACarryThroughGameModeBase
3、启动切换关卡
切换关卡时注意需要独立进程启动,并且不要使用Openlevel节点!可使指令节点,启用无缝切换地图。
指令命令参照(注意分割空格):ServerTravel /Game/Maps/l02
也可以在C++中调用代码切换,源码结构如下:
/**
* Jumps the server to new level. If bAbsolute is true and we are using seemless traveling, we
* will do an absolute travel (URL will be flushed).
*
* @param URL the URL that we are traveling to
* @param bAbsolute whether we are using relative or absolute travel
* @param bShouldSkipGameNotify whether to notify the clients/game or not
*/
bool
ServerTravel(
const
FString& InURL,
bool
bAbsolute =
false
,
bool
bShouldSkipGameNotify =
false
);
源码位置:UWorld
效果展示
切换后Actor原有状态不变,数据不变。在一些设计中,仍需要考虑携带过关的Actor是否会关联其他对象,关联对象是否要被携带过关,所以这也是一个复杂的设计。
引擎版本: 5.1
本站所有文章、资源等一切内容,皆为在本站的注册网友所发布、上传、提供,如您发现任何内容侵犯了您的合法权益, 请与我们联系 ,我们将第一时间进行清理。iiiue.com 旨在为广大虚幻引擎爱好者提供技术交流学习、知识技术变现平台。
永久域名 iii ue .com 本站投稿能赚取收益变现提现,请一定要牢记账号密码!
Ue资源站 iiiue.com » 使用虚幻引擎(UE5)实现Actor携带过关卡功能(附完整工程源码)
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有内容皆为网友发布,资源版权均属于原作者所有,如需商用请联系原作者获取授权许可,若由于商用引起版权纠纷,一切责任均由使用者承担。如您发现某些内容侵犯了您的合法权益, 请与我们联系 ,我们将在第一时间核实并清理。
- 下载的资源解压密码是多少?
- 任何资源的解压密码均由发布者提供,一般情况下都在资源的发布页面或者资源文件夹,请仔细检查,如您发现发布页面没有提供解压密码,请您试着在评论处留言联系作者
点击查看解压软件和密码说明
Tips:除了密码说明内的解压密码外,通常情况下,电脑在安装好RAR或360解压缩软件,双击打开压缩包,包内注释的网址也可以试试是否为解压密码哦
- 资源能否免费获取
- 本站用户可参与站内的一系列活动获取积分,资源皆可免费获取,若想快速获取可加入本站永久VIP钻石会员,荣耀身份,全站资源免费获取, 点此查看详情