UE4 C++实现发出伤害与接收伤害

Posted TanZq_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UE4 C++实现发出伤害与接收伤害相关的知识,希望对你有一定的参考价值。

效果展示

敌人攻击玩家,玩家会扣血,玩家攻击敌人,也会扣血。
图中,敌人对玩家进行了攻击吗,释放出了火的粒子特效,玩家受到伤害扣了血。
玩家也对敌人进行了攻击,秒杀,敌人有一个死亡动画。

玩家血量为0时也会死亡。

死亡之后一切碰撞响应都关闭了,穿模了😓

添加死亡动画

在各自的蒙太奇中添加死亡动画,

后面随便添加一个动画,防止死亡之后又出现另一个蒙太奇动画的现象。

添加DeathEnd通知,这个点在动画结束的前一点点:

C++代码

Role 第三人称角色

.h

// 重载接受伤害的函数
virtual float TakeDamage(float DamageAmount, struct FDamageEvent const& DamageEvent,
	class AController* EventInstigator, AActor* DamageCauser) override;

// 死亡后的处理
UFUNCTION(BlueprintCallable)
	void DeathEnd();

.cpp

  • TakeDamage
float ARole::TakeDamage(float DamageAmount, struct FDamageEvent const& DamageEvent, class AController* EventInstigator, AActor* DamageCauser)
{
	SufferDamage(DamageAmount); // 调用之前定义的受到伤害扣血的函数
	return DamageAmount; // 返回伤害值
}
  • 完善Die

添加头文件: #include "Components/CapsuleComponent.h"

void ARole::Die()
{
	// 当调用到他的时候就说明任务已经死了,把动画调用出来,进行播放,碰撞响应关闭。
	UAnimInstance* Instance = GetMesh()->GetAnimInstance(); 
	if (_AnimMontage && Instance) {
		Instance->Montage_Play(_AnimMontage);
		Instance->Montage_JumpToSection(FName("Death"), _AnimMontage);
	}
	GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision);
}
  • DeathEnd
void ARole::DeathEnd()
{
	// 当死亡动画结束的时候,需要把动画蒙太奇给关掉。
	UAnimInstance* Instance = GetMesh()->GetAnimInstance();
	if (_AnimMontage && Instance) {
		Instance->Montage_Pause();
	}
}

角色动画中需要添加:


记得编译。
当人物血条为空的时候,调用Die - 调用死亡动画 - 动画结束通知 - 调用DeathEnd;

Weapon

.h

// 武器的伤害
UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float Damage;

// 接受伤害的类型
UPROPERTY(EditAnywhere, BlueprintReadWrite)
	TSubclassOf<UDamageType> DamageTypeClass;

.cpp

  • 初始化
    Damage = 10;

AttackTracer

.cpp

  • NotifyTick

添加:

if (Player->GetWeapon()->DamageTypeClass) {
	UGameplayStatics::ApplyDamage(HitEnemy, Player->GetWeapon()->Damage, Player->GetController(), Player->GetWeapon(), Player->GetWeapon()->DamageTypeClass);
}

对敌人HitEnemy造成Damage伤害。
ApplyDamage提供伤害,TakeDamage接受伤害。

Enemy

.h

//  死亡函数
void Die();

// 重载接受伤害函数
virtual float TakeDamage(float DamageAmount, struct FDamageEvent const& DamageEvent,
	class AController* EventInstigator, AActor* DamageCauser) override;

// 敌人攻击造成的伤害。
UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float Damage;

// 攻击伤害类型
UPROPERTY(EditAnywhere, BlueprintReadWrite)
	TSubclassOf<UDamageType> DamageTypeClass;

// 敌人当前血量
UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float Health;

// 敌人最大血量
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
	float MaxHealth;

// 死亡动画结束调用的函数
UFUNCTION(BlueprintCallable)
	void DeathEnd();

.cpp

  • 构造函数,初始化操作
Damage = 10;
	Health = 100;
	MaxHealth = 100;
  • 接受伤害函数TakeDamage
float AEnemy::TakeDamage(float DamageAmount, struct FDamageEvent const& DamageEvent, class AController* EventInstigator, AActor* DamageCauser)
{
	if (Health > DamageAmount) {
		Health -= DamageAmount;
	}
	else {
		Health = 0;
		Die();
	}
	return DamageAmount;
}
  • Die()
UAnimInstance* Instance = GetMesh()->GetAnimInstance();
if (_AnimMontage && Instance) {
	Instance->Montage_Play(_AnimMontage);
	Instance->Montage_JumpToSection(FName("Death"), _AnimMontage);
}

DisableCollision();
AttackSphere->SetCollisionEnabled(ECollisionEnabled::NoCollision);
DetectSphere->SetCollisionEnabled(ECollisionEnabled::NoCollision);
MoveStatus = EMoveStatus::MS_Dead;
GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision);
  • DeathEnd
void AEnemy::DeathEnd()
{
	UAnimInstance* Instance = GetMesh()->GetAnimInstance();
	if (_AnimMontage && Instance) {
		Instance->Montage_Pause();
	}
}

在敌人的动画蓝图中添加:

结束!赶紧试试吧~

以上是关于UE4 C++实现发出伤害与接收伤害的主要内容,如果未能解决你的问题,请参考以下文章

UE4 C++ 实现敌人追逐与攻击

UE4 C++实现近战攻击,精准检测与碰撞检测

UE4实现VR下匕首攻击的方法

UE4 C++ 绑定敌人血条

Ruby‘s Adventrue游戏制作笔记Unity伤害陷阱

Ruby‘s Adventrue游戏制作笔记Unity伤害陷阱