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

我们接下来实现一个基础功能,这篇的篇幅会比较短一些,因为下篇的篇幅和此功能没关系。

所以单独开一篇讲解。

我们要实现的功能是在角色死亡后,会在一段时间后,自动在上一次存档位置复活。

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

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

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

cpp 复制代码
void ARPGGameMode::PlayerDied(const ACharacter* DeadCharacter) const
{
	//获取存档数据
	const ULoadScreenSaveGame* SaveGame = RetrieveInGameSaveData();
	if(!IsValid(SaveGame)) return;

	//通过地图命名打开地图
	UGameplayStatics::OpenLevelBySoftObjectPtr(DeadCharacter, Maps.FindChecked(SaveGame->MapName));
}

我们在玩家角色类里,覆写死亡函数,这个死亡函数本身是在基类里实现的,处理角色死亡后一些逻辑。

然后我们增加一个时间定义,在角色死亡后多少秒后,调用GameMode的PlayerDied函数,并创建一个时间轴。

cpp 复制代码
	/* 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 秒后,将触发回调。

最后,为了保证玩家角色死亡后,相机不跟随玩家乱跑,我们将其固定在固定位置。

cpp 复制代码
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,并调用死亡广播(这个一般用到敌人角色上,为角色提供经验。)

相关推荐
ffreask34 分钟前
2 硬件选型指南:如何为openclaw选择最佳小龙虾处理设备
数码相机·ai·编程·技术
Bnews1 小时前
动作捕捉技术:机器人科研的精准“眼睛”与NOKOV度量动捕的创新实践
数码相机·机器人
Mountain and sea2 小时前
工业机器人视觉系统配置与调试完全指南:从硬件选型到实战应用
数码相机·机器人
3DVisionary2 小时前
汽车玻璃曲面偏差难控?蓝光3D扫描仪精准把关整车装配面差
人工智能·数码相机·计算机视觉·热失控·xtdic·xtom·动力电池测试
格林威3 小时前
Halcon vs OpenCV 速度对比(表格)
人工智能·数码相机·opencv·机器学习·计算机视觉·视觉检测·halcon
格林威3 小时前
工业相机图像高速存储(C#版):先存内存,后批量转存方法,附海康相机实战代码!
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·海康相机
JK Chen3 小时前
UE5 编辑器下添加组件
ue5·编辑器
暮志未晚Webgl4 小时前
UE5使用CommonUI实现手柄进行UI导航
ui·ue5·commonui
格林威5 小时前
工业相机图像高速存储(C++版):先存内存,后批量转存方法,附海康相机实战代码!
开发语言·c++·人工智能·数码相机·计算机视觉·工业相机·堡盟相机
格林威5 小时前
工业相机图像高速存储(C++版):内存映射文件(MMF)零拷贝方案,附堡盟 (Baumer) 相机实战代码!
开发语言·c++·人工智能·数码相机·计算机视觉·视觉检测·工业相机