一.创建
二.UI里声明变量
创建类
public: UPROPERTY(EditAnywhere,BlueprintReadWrite,Category = "MyWidget") float CurrentHealth = 100.0f; UPROPERTY(EditAnywhere,BlueprintReadWrite,Category = "MyWidget") float MaxHealth = 100.0f; //可以给默认值
绑定监听函数
函数里使用父类变量进行计算 百分比
三.在Character里声明
重写受伤虚函数
#include "MyHealthWidget.h"
UWidgetComponent* MyWidgetHealth;
virtual float TakeDamage(float DamageAmount,FDamageEvent const &DamageEvent,class AController*EventInstigator,AActor* DamagerCausser)override; //重写系统内部的TakeDamage
四.编写逻辑
创建对象
MyWidgetHealth = CreateDefaultSubobject(TEXT("MyWidgetComponent")); MyWidgetHealth->SetupAttachment(RootComponent); static ConstructorHelpers::FClassFinderWidgetClass(TEXT("/Script/UMGEditor.WidgetBlueprint'/Game/UMG_Health.UMG_Health_C'")); //静态加载 MyWidgetHealth->SetWidgetClass(WidgetClass.Class); MyWidgetHealth->SetRelativeLocation(FVector(0,0,100)); MyWidgetHealth->SetWidgetSpace(EWidgetSpace::Screen); // 输出到屏幕 MyWidgetHealth->SetDrawSize(FVector2D(400,20));
受伤-5血量
float AMyCharacter::TakeDamage(float DamageAmount, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamagerCausser) { UMyHealthWidget* MyWidget = Cast(MyWidgetHealth->GetUserWidgetObject()); if (MyWidget) { if (MyWidget->CurrentHealth > 0) { MyWidget->CurrentHealth -= 5.f; } else { return 0.f; } } return 0.0f; }
五.造成角色伤害物体
#include "Kismet/GameplayStatics.h" //Aplaydamage 函数库里的头文件 #include "MyCharacter.h" //后面用于转化
UFUNCTION() void BeginOverlapFunction(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult); UFUNCTION() void EndOverlapFunction( UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex); //四个参数 // FComponentEndOverlapSignature, UPrimitiveComponent, OnComponentEndOverlap, UPrimitiveComponent*, OverlappedComponent, AActor*, OtherActor, UPrimitiveComponent*, OtherComp, int32, OtherBodyIndex UFUNCTION() void HitOverlaoFunction(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit); //UPrimitiveComponent*, HitComponent, AActor*, OtherActor, UPrimitiveComponent*, OtherComp, FVector, NormalImpulse, const FHitResult&, Hit
逻辑碰撞,判断是否是角色。再造成ApplyDamage伤害。
void AMyActor::BeginOverlapFunction(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) { AMyCharacter* MyCharacter = Cast(OtherActor); //转换 if (MyCharacter) { UGameplayStatics::ApplyDamage(MyCharacter,5.0f,nullptr,this,UDamageType::StaticClass()); //应用伤害 } GEngine->AddOnScreenDebugMessage(-1,5.0f,FColor::Red,TEXT("BeginOverLapEvent is Success")); MyParticle->Activate(); //激活 } void AMyActor::EndOverlapFunction( UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex) { MyParticle->Deactivate(); //失效 GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("EndOverlapEvent is Success")); } void AMyActor::HitOverlaoFunction(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit) { GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("HitOverlapEvent is Success")); }