创建组件的c++类,一共有两种组件类,然后我们选择actor的那一种。
路径也加上组件后缀
那么场景组件和actor组件区别是什么呢
场景组件主要是能看到;
actor组件看不到,纯功能性组件。
在类中添加一个成员变量
- //当前生命值
- UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "HealthComponent")
- float Health;
这里名字改成了COOP
编译,然后打开玩家蓝图,添加组件
我们发现该组件在COOP分组里面
=================
回到组件c++类,继续添加成员
- //最大生命值
- UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "HealthComponent")
- float DefaultHealth;
在构造函数中将其设置成100
DefaultHealth = 100;
在游戏开始函数里,将做大健康值赋予当前健康值
- // Called when the game starts
- void USHealthComponent::BeginPlay()
- {
- Super::BeginPlay();
-
- Health = DefaultHealth;
-
- }
添加一个函数,用来处理伤害
- //承受伤害
- UFUNCTION()
- void HandleTakeAnyDamage(AActor* DamagedActor, float Damage, const class UDamageType* DamageType, class AController* InstigatedBy, AActor* DamageCauser);
定义这个函数
- 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);
- }
导入actor的头文件
#include "GameFramework/Actor.h"
在游戏开始函数里,调用伤害函数
- // Called when the game starts
- void USHealthComponent::BeginPlay()
- {
- Super::BeginPlay();
-
- Health = DefaultHealth;
-
- AActor * Owner = GetOwner();
- if (Owner)
- {
- Owner->OnTakeAnyDamage.AddDynamic(this, &USHealthComponent::HandleTakeAnyDamage);
- }
- }
为了方便测试
我们添加一个输出日志,打印生命值
UE_LOG(LogTemp, Log, TEXT("Health %s"), *FString::SanitizeFloat(Health));
编译,然后打开靶子蓝图,添加一个生命值组件
并且我们向场景中拉入一个新的玩家类
我们发现了一个bug,我们打其他玩家,没有溅血的效果。
是因为胶囊体的阻挡缘故。
我们这样设置胶囊体的碰撞,这样子弹就可以打在网格体上了
运行