打开生命值组件的头文件,声明一个宏
DECLARE_DYNAMIC_MULTICAST_DELEGATE_SixParams(FOnHealthChangedSignature, USHealthComponent*, HealthComp, float, Health, float, HealthDelta, const class UDamageType*, DamageType, class AController*, InstigatedBy, AActor*, DamageCauser);
声明一个自定义事件的变量
//自定义事件的变量
UPROPERTY( BlueprintAssignable, Category = "HealthComponent")
FOnHealthChangedSignature OnHealthChanged;
完善一下HandleTakeAnyDamage函数
void USHealthComponent::HandleTakeAnyDamage(AActor * DamagedActor, float Damage, const UDamageType * DamageType, AController * InstigatedBy, AActor * DamageCauser)
{
//当前生命值<=0,就不做任何处理
if (Health <= 0)
{
return;
}
//承受伤害
Health = FMath::Clamp(Health - Damage, 0.0f, DefaultHealth);
UE_LOG(LogTemp, Log, TEXT("Health :%s"), *FString::SanitizeFloat(Health));
//自定义事件
OnHealthChanged.Broadcast(this, Health, Damage, DamageType, InstigatedBy, DamageCauser);
}
编译
回到ue的靶子蓝图里面
点击生命值组件
就会发现我们新创建的事件(如果没有,就删掉组件,重新添加组件)
编写蓝图
测试
=================================
现在让患者死亡会播放动画
目前,我们在玩家类里主动添加一个生命值组件,而不在蓝图里添加了
在其类中添加一个成员变量
//生命值组件
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components")
class USHealthComponent * HealthComp;
在构造函数中进行初始化
#include "Components/SHealthComponent.h"
HealthComp = CreateDefaultSubobject(TEXT("HealthComp"));
声明一个玩家受伤函数
//玩家受伤害函数
UFUNCTION()
void OnHealthChanged(USHealthComponent* OwnerHealthComp, float Health, float HealthDelta, const class UDamageType* DamageType, class AController* InstigatedBy, AActor* DamageCauser);
参数为宏定义中的参数
参数不能与成员变量同名,所以我们要换一下参数的名字
然后我们再创建一个成员变量来标记死亡
//是否死亡
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Player")
bool bDied;
在构造函数中,我们初始化为false
bDied = false;
现在定义受伤函数
void ASCharacter::OnHealthChanged(USHealthComponent * OwnerHealthComp, float Health, float HealthDelta, const UDamageType * DamageType, AController * InstigatedBy, AActor * DamageCauser)
{
//如果已经死了,不做任何处理
if (bDied)
{
return;
}
//如果人没死,但是没有血了,就让其死亡
if (Health <= 0 && !bDied)
{
bDied = true;
//限制人物的移动
GetMovementComponent()->StopMovementImmediately();
//让胶囊体无碰撞
GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision);
//让玩家控制器与玩家角色分离,并让角色消失(3s)
DetachFromControllerPendingDestroy();
SetLifeSpan(3.0f);
}
}
在开始函数中,使用该组件的伤害自定义事件,来绑定该函数
//受伤自定义事件绑定
HealthComp->OnHealthChanged.AddDynamic(this, &ASCharacter::OnHealthChanged);
编译,然后打开动画蓝图,然后到最上面那一层
现在有很多死亡动画,我们使用动画蓝图控制其播放
右键搜play death
我们选择第一个(任意选的)
点击该节点,取消循环播放动画
然后添加一个bool变量,然后添加一个节点