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++实现发出伤害与接收伤害的主要内容,如果未能解决你的问题,请参考以下文章