14uec++多人游戏【c++添加自定义事件】

打开生命值组件的头文件,声明一个宏

DECLARE_DYNAMIC_MULTICAST_DELEGATE_SixParams(FOnHealthChangedSignature, USHealthComponent*, HealthComp, float, Health, float, HealthDelta, const class UDamageType*, DamageType, class AController*, InstigatedBy, AActor*, DamageCauser);

14uec++多人游戏【c++添加自定义事件】_第1张图片

 声明一个自定义事件的变量

	//自定义事件的变量
	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的靶子蓝图里面

点击生命值组件

14uec++多人游戏【c++添加自定义事件】_第2张图片

 就会发现我们新创建的事件(如果没有,就删掉组件,重新添加组件)

14uec++多人游戏【c++添加自定义事件】_第3张图片

 编写蓝图

14uec++多人游戏【c++添加自定义事件】_第4张图片

测试

14uec++多人游戏【c++添加自定义事件】_第5张图片

=================================

现在让患者死亡会播放动画

 目前,我们在玩家类里主动添加一个生命值组件,而不在蓝图里添加了

在其类中添加一个成员变量

	//生命值组件
	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);

参数为宏定义中的参数

14uec++多人游戏【c++添加自定义事件】_第6张图片

参数不能与成员变量同名,所以我们要换一下参数的名字

14uec++多人游戏【c++添加自定义事件】_第7张图片

 然后我们再创建一个成员变量来标记死亡

	//是否死亡
	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);

编译,然后打开动画蓝图,然后到最上面那一层

14uec++多人游戏【c++添加自定义事件】_第8张图片

 现在有很多死亡动画,我们使用动画蓝图控制其播放

14uec++多人游戏【c++添加自定义事件】_第9张图片

右键搜play death

14uec++多人游戏【c++添加自定义事件】_第10张图片 

我们选择第一个(任意选的)

14uec++多人游戏【c++添加自定义事件】_第11张图片

点击该节点,取消循环播放动画

14uec++多人游戏【c++添加自定义事件】_第12张图片 

然后添加一个bool变量,然后添加一个节点

14uec++多人游戏【c++添加自定义事件】_第13张图片

14uec++多人游戏【c++添加自定义事件】_第14张图片 编写蓝图

14uec++多人游戏【c++添加自定义事件】_第15张图片

 

 

 

你可能感兴趣的:(游戏,ue4,c++)