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

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

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

引言: 在中,每个关卡都被视作一个独立的世界,即UWorld类型。这些世界遵循各自的规则,尽管不同关卡可能共享相似的规则,但它们并不是同一套规则。这有点像不同国家虽然有相似的法律,如都将盗窃视为犯罪,但各自的法律体系是独立的。

虚幻引擎设计了一种机制,即在任一时刻,只允许一个世界(关卡)存在。因此,当我们从一个关卡移动到另一个时,当前关卡的对象会被销毁,新关卡的对象与旧关卡的对象是相互独立的。

那么,有没有办法将对象从一个关卡带到另一个关卡呢?答案是肯定的!这需要利用虚幻引擎提供的无缝漫游功能。

注意:无缝漫游功能无法直接通过实现,必须借助代码。

操作步骤: 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!

 

本站声明:
本站所有文章、资源等一切内容,皆为在本站的注册网友所发布、上传、提供,如您发现任何内容侵犯了您的合法权益,请携版权等相关证明致信vamwxyz@gmail.com 与我们联系 ,我们将第一时间进行处理。本站周1-周5每日稳定更新优质资源20+,开通永久SVIP全站资源永久免费!
本站防失联地址,请务必收藏:VAMW.XYZ
VAM » 使用虚幻引擎(UE5)实现Actor携带过关卡功能(附完整工程源码)
广告
也想出现在这里? 联系我们

常见问题FAQ

关于解压密码和游戏资源使用方式的简要说明
本站默认解压密码为发布页网址:vamw.xyz 注意是小写,如果有其他密码也都在资源页面详细说明了,请认真查看,任何资源请下载后解压、切勿在线解压!VAM场景和人物形象资源下载解压缩后,放到VAM游戏目录里的AddonPackages文件夹后重启游戏即可,如D:\VAM\vam1.22.0.3\AddonPackages;更多教程请点击打开
海外用户怎么支付怎么下载?How can overseas users make payments and download?
本站支持“支付宝”、“微信”、“paypal”方式支付,如需“paypal”支付,请点击链接 https://paypal.me/vamwxyz;本站所有资源存储于“百度云网盘”,海外用户亦可通过本站教程下载安装注册“百度云网盘”进行资源的下载使用,点击查看教程
Our website supports payments via "Alipay", "WeChat" and "PayPal". If you want to pay with "PayPal", please click here https://paypal.me/vamwxyz;. All the resources on our website are stored in "Baidu Cloud Disk". Overseas users can also download, install and register "Baidu Cloud Disk" according to the tutorials on our website to download and use the resources. Click here to view the tutorials
怎么推广赚钱,怎么免费加入VIP?
高佣金活动进行中:本站开启用户推广赚钱模式,所有用户可以通过文章页或个人中心的的推广链接进行推广赚钱,普通用户推广佣金为15%;永久VIP推广佣金为30%,所有通过你的推广链接注册的用户,在后续发生的所有消费或充值会员的行为,您都有佣金拿!满50可申请提现!普通用户可以在金额达到充值会员金额的时候申请加入会员!赶快行动吧! 点此查看详情

发表回复

广告
也想出现在这里? 联系我们
© 2018 Theme by - VAMW.XYZ 绅士VAM资源站 & All rights reserved 冀ICP备19025219号-2
开通终身VIP 永久VIP折扣活动火热进行中,享全站资源免费下载特权!