115. UE5 GAS RPG 实现角色死亡后从存档点复活

embedded/2024/12/28 13:06:22/

我们接下来实现一个基础功能,这篇的篇幅会比较短一些,因为下篇的篇幅和此功能没关系。
所以单独开一篇讲解。
我们要实现的功能是在角色死亡后,会在一段时间后,自动在上一次存档位置复活。

首先,我们在GameMode里增加一个新函数,用于处理角色死亡后,重新在检查点开始的逻辑。

	/*** 角色死亡调用函数* @param DeadCharacter 玩家角色实例*/void PlayerDied(const ACharacter* DeadCharacter) const;

然后实现函数,获取到已经存储的存档,然后重新打开关卡

void ARPGGameMode::PlayerDied(const ACharacter* DeadCharacter) const
{//获取存档数据const ULoadScreenSaveGame* SaveGame = RetrieveInGameSaveData();if(!IsValid(SaveGame)) return;//通过地图命名打开地图UGameplayStatics::OpenLevelBySoftObjectPtr(DeadCharacter, Maps.FindChecked(SaveGame->MapName));
}

我们在玩家角色类里,覆写死亡函数,这个死亡函数本身是在基类里实现的,处理角色死亡后一些逻辑。
然后我们增加一个时间定义,在角色死亡后多少秒后,调用GameMode的PlayerDied函数,并创建一个时间轴。

	/* ICombatInterface战斗接口 */virtual int32 GetPlayerLevel_Implementation() override;virtual void Die(const FVector& DeathImpulse) override;/* ICombatInterface战斗接口 结束 *///角色死亡后持续时间,用于表现角色死亡UPROPERTY(EditDefaultsOnly)float DeathTime = 5.f;//声明一个计时器,用于角色死亡后一定时间处理后续逻辑FTimerHandle DeathTimer;

在函数实现这里,我们还是需要调用父类的死亡函数,处理之前的逻辑,然后我们创建一个计时器委托,用于绑定计时回调,回调里,我们绑定了一个匿名函数,在匿名函数里调用GameMode的PlayerDied函数。
然后我们通过SetTimer函数调用激活计时器,在我们设置的DeathTime 秒后,将触发回调。
最后,为了保证玩家角色死亡后,相机不跟随玩家乱跑,我们将其固定在固定位置。

void ARPGHero::Die(const FVector& DeathImpulse)
{Super::Die(DeathImpulse);//创建一个委托,用于绑定委托回调FTimerDelegate DeathTimerDelegate;DeathTimerDelegate.BindLambda([this](){if(const ARPGGameMode* RPGGameMode = Cast<ARPGGameMode>(UGameplayStatics::GetGameMode(this))){RPGGameMode->PlayerDied(this);}});//通过定时器触发对应的委托广播GetWorldTimerManager().SetTimer(DeathTimer, DeathTimerDelegate, DeathTime, false);//防止相机在玩家角色死亡后跟随移动,将相机固定在世界坐标位置TopDownCameraComponent->DetachFromComponent(FDetachmentTransformRules::KeepWorldTransform);
}

随便我们回忆一下设置在角色基类上的死亡函数,它就实现了将武器分离,然后通过一个多播函数(在每个端都会执行的函数),来执行死亡后的处理,并开启角色和武器的物理效果,并将角色的碰撞体关闭,防止对开启物理效果的角色和武器造成碰撞影响。
角色溶解效果是在敌人身上实现的,如果角色身上实现,我们还需要增加角色材质,这里我不再做演示,可以翻一翻之前的文章。
在函数最后,设置死亡状态为true,并调用死亡广播(这个一般用到敌人角色上,为角色提供经验。)
在这里插入图片描述


http://www.ppmy.cn/embedded/143192.html

相关文章

Python从入门到入狱

Python是从入门到入狱&#xff1f;这个充满调侃意味的说法在程序员圈子里流传甚广。表面看&#xff0c;它似乎是在嘲笑这门语言从简单易学到深陷麻烦的巨大反差&#xff0c;实际上却隐藏着很多值得深思的问题。要解读这个话题&#xff0c;得从Python的特点、使用场景以及潜在风…

基于STM32的Wi-Fi无人机项目

引言 随着无人机技术的快速发展&#xff0c;基于微控制器的DIY无人机变得越来越流行。本项目将介绍如何使用STM32微控制器制作一架简单的Wi-Fi无人机。通过本项目&#xff0c;您将了解到无人机的基本组成部分&#xff0c;如何进行硬件连接&#xff0c;代码编写&#xff0c;以及…

Hbase整合Mapreduce案例1 hdfs数据上传至hbase中——wordcount

目录 整合结构准备java API 编写pom.xmlMain.javaMap.javaReduce 运行 整合结构 准备 上传hdfs data.txt数据 data.txt I am wunaiieq QAQ 123456 Who I am In todays interconnected world the role of technology cannot be overstated It has revolutionized the way we …

深入探讨NIO

目录 传统阻塞IO 非阻塞IO select() epoll 总结 传统阻塞IO 非阻塞IO IO多路复用select() IO多路复用epoll 传统阻塞IO 在传统的阻塞IO模型中&#xff0c;当一个线程执行到IO操作&#xff08;如读取数据&#xff09;时&#xff0c;如果数据尚未准备好&#xff0c;它会…

爬虫项目基础知识详解

文章目录 Python爬虫项目基础知识一、爬虫与数据分析1.1 Python中的requests库Requests 库的安装Requests 库的 get() 方法爬取网页的通用代码框架HTTP 协议及 Requests 库方法Requests 库主要方法解析 1.2 python中的json库1.3 xpath学习之python中lxml库html了解html结构html…

llvm源码编译

0x00 获取llvm源码 获取llvm项目源码&#xff1a;git clone https://github.com/llvm/llvm-project.git 但是&#xff0c;该项目较大&#xff0c;且直接从github下载源码可能会超时失败。可利用gitee的镜像项目进行clone&#xff1a;git clone --depth 1 https://gitee.com/m…

Maven 内置绑定到底怎么回事?

Maven是一个很好的项目管理工具. 一方面有着众多脚手架&#xff0c;另一方面在依赖管理方面 帮助使用者做了很多准备工作. 随着Maven的使用和学习的深入&#xff0c;大家会不仅有一些问题。 比较浅显的一个就是&#xff0c; 日常我们的Maven 下载安装好以后&#xff0c;在IDE 里…

WebRover :一个功能强大的 Python 库,用于从 Web 内容生成高质量的数据集,专为训练大型语言模型和 AI 应用程序而设计。

2024-11-30 &#xff0c;由Area-25团队开发的一个专门用于生成高质量网络内容数据集的Python库。该数据集旨在为大型语言模型&#xff08;LLM&#xff09;和人工智能应用的训练提供丰富的数据资源。 数据集地址&#xff1a;WebRover Dataset|自然语言处理数据集|AI模型训练数据…