欢迎您光临本站,秉承服务宗旨,履行"站长"责任,销售只是起点,服务永无止境!

使用虚幻引擎(UE5)实现Actor携带过关卡功能(附完整工程源码)

作者 : qwe789 本文共3635个字,预计阅读时间需要10分钟 发布时间: 2024-04-17 共3.93K人阅读
广告
也想出现在这里? 联系我们

引言: 在虚幻引擎中,每个关卡都被视作一个独立的世界,即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;
};
ACarryThroughGameModeBase.cpp源码
#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

钻石价 5 折 永久钻石免费

已有99人支付

永久VIP全站资源免费,限时折扣开通中!
Permanent VIP full site resources are free!

 

版权声明:
本站所有文章、资源等一切内容,皆为在本站的注册网友所发布、上传、提供,如您发现任何内容侵犯了您的合法权益, 请与我们联系 ,我们将第一时间进行清理。iiiue.com 旨在为广大虚幻引擎爱好者提供技术交流学习、知识技术变现平台。
永久域名 iii ue .com 本站投稿能赚取收益变现提现,请一定要牢记账号密码!
Ue资源站 iiiue.com » 使用虚幻引擎(UE5)实现Actor携带过关卡功能(附完整工程源码)
广告
也想出现在这里? 联系我们

常见问题FAQ

免费下载或者VIP会员专享资源能否直接商用?
本站所有内容皆为网友发布,资源版权均属于原作者所有,如需商用请联系原作者获取授权许可,若由于商用引起版权纠纷,一切责任均由使用者承担。如您发现某些内容侵犯了您的合法权益, 请与我们联系 ,我们将在第一时间核实并清理。
下载的资源解压密码是多少?
任何资源的解压密码均由发布者提供,一般情况下都在资源的发布页面或者资源文件夹,请仔细检查,如您发现发布页面没有提供解压密码,请您试着在评论处留言联系作者
点击查看解压软件和密码说明
Tips:除了密码说明内的解压密码外,通常情况下,电脑在安装好RAR或360解压缩软件,双击打开压缩包,包内注释的网址也可以试试是否为解压密码哦
资源能否免费获取
本站用户可参与站内的一系列活动获取积分,资源皆可免费获取,若想快速获取可加入本站永久VIP钻石会员,荣耀身份,全站资源免费获取, 点此查看详情

发表回复

广告
也想出现在这里? 联系我们
开通终身VIP 永久VIP折扣活动火热进行中,享全站资源免费下载特权!