UE5 C++ 创建3DWidgete 血条 再造成伤害

news/2024/9/23 5:19:16/

一.创建

二.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<UWidgetComponent>(TEXT("MyWidgetComponent"));
MyWidgetHealth->SetupAttachment(RootComponent);
static ConstructorHelpers::FClassFinder<UUserWidget>WidgetClass(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<UMyHealthWidget>(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<AMyCharacter>(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"));
}


http://www.ppmy.cn/news/1426982.html

相关文章

一个实例了解JVM运行原理

下面以一个具体的代码示例&#xff0c;来说明Java代码对象是如何分配的&#xff0c;Java代码又是如何在JVM中运行的。 public class JVMCase {// 常量public final static String MAN_SEX_TYPE "man";// 静态变量public static String WOMAN_SEX_TYPE "woman…

数据采集技术综合项目实战3(网络爬虫+数据预处理+数据可视化)附带详细步骤说明,干货满满

项目介绍及需求&#xff1a; 本项目主要是通过对b站电影弹幕进行采集并分析。1.获得弹幕高频词生成符合该电影特征、主题、角色等相关字段的词云图&#xff0c;通过词云图的方式对某部电影主题具体化。2.获取用户年内评论发布时间观生成时间的折线图&#xff0c;以便从侧面观察…

设计模式之状态模式(上)

状态模式 1&#xff09;概述 1.定义 允许一个对象在其内部状态改变时改变它的行为&#xff0c;对象看起来似乎修改了它的类。 2.作用 状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。 3.方案 状态模式将一个对象的状态从该对象中分离出来&…

leetcode不同路径

. - 力扣&#xff08;LeetCode&#xff09; 62. 不同路径 中等 相关标签 相关企业 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下…

element-ui合计逻辑踩坑

element-ui合计逻辑踩坑 1.快速实现一个合计 ​ Element UI所提供的el-table中提供了方便快捷的合计逻辑实现&#xff1a; ​ https://element.eleme.cn/#/zh-CN/component/table ​ 此实现方法在官方文档中介绍详细&#xff0c;此处不多赘述。 ​ 这里需要注意&#xff0c…

K8S 亲和性与反亲和性

介绍 在 Kubernetes 中&#xff0c;亲和性&#xff08;Affinity&#xff09;是一种用于控制 Pod 调度的机制&#xff0c;它允许你指定 Pod 如何与节点进行互动&#xff0c;以便将 Pod 调度到合适的节点上。亲和性可以分为两种类型&#xff1a;节点亲和性&#xff08;Node Affi…

0-1 数据大屏——这样设计高质量可视化大屏

5 大指南塑造高阶可视化 可视化是个友好的媒介 理解数据是成为优秀媒介的关键 业务驱动下的设计策略 图扑设计的无限可能 创新思维让可视化更具价值 可视化是个友好的媒介 我们正处于一个数据泛滥的时代&#xff0c;随处可见数据的身影&#xff0c;更知其不可忽视的重要…

使用 Lua 协程处理异步回调函数

异步回调 项目使用 C Lua 方式&#xff0c;C 主要编写一些底层模块&#xff0c;通常提供异步的方式 Lua 脚本中&#xff0c;使用这些 C 导入的模块&#xff0c;和异步方式编写代码 一般的一次异步调用&#xff0c;通常还可以编写逻辑清晰的代码 但是会有些功能会比较复杂的…