当前位置: 首页 > news >正文

UE5 C++ 3D血条 响应人物受伤 案例

一.3Dwidget

1.创建C++ Userwidget的 MyHealthWidget,声明当前血量和最大血量

UCLASS()
class PRACTICEC_API UMyHealthWidget : public UUserWidget
{GENERATED_BODY()
public:UPROPERTY(EditAnywhere,BlueprintReadWrite,Category  = "MyWidget")float CurrentHealth = 100.0f;UPROPERTY(EditAnywhere,BlueprintReadWrite,Category = "MyWidget")float MaxHealth = 100.0f; //可以给默认值};

2.创建UMG的蓝图,ClassSetting里 继承 MyHealthWidget.

3.

二.渲染到屏幕

在Charactor的构造函数中,构建子组件。并且静态加载UMG类。设置位置,屏幕,大小等。

	UWidgetComponent* MyWidgetHealth;
	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));

三.碰撞伤害

1.在Actor 添加头文件 和 碰撞函数

#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

2.在CPP里实现 ,如果人物刚碰撞 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(); //激活
}

四.人物收到伤害 血条响应

重写内部受伤函数

	virtual float TakeDamage(float DamageAmount,FDamageEvent const &DamageEvent,class AController*EventInstigator,AActor* DamagerCausser)override; //重写系统内部的TakeDamage 
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;
}

获得指针UserWidget 转换为 UMyHealthWidget,做相应的逻辑操作。

五.效果

http://www.lryc.cn/news/324876.html

相关文章:

  • 阿里云2核4G服务器支持多少人在线?2C4G多少钱一年?
  • 【STK】手把手教你利用STK进行导弹和反导仿真02 - STK/MMT模块01 导弹任务分析工具概述
  • 新台阶——蓝桥杯单片机省赛第十四届程序设计题目
  • php魔术方法
  • Linux系统——Mysql索引详解
  • Java22已发布,支持SpringBoot3.3.0正式版
  • 第二证券策略:关注部分华为板块、年报绩优品种反弹机会
  • IBM SPSS Statistics for Mac v27.0.1中文激活版
  • C# WPF编程-布局
  • 上位机图像处理和嵌入式模块部署(qmacvisual点线测量)
  • yolov5训练并生成rknn模型部署在RK3588开发板上,实现NPU加速推理
  • SCI一区 | Matlab实现SSA-TCN-BiGRU-Attention麻雀算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测
  • javaSwing宿舍管理系统(三个角色)
  • 蓝桥杯day12刷题日记
  • 深度学习pytorch——多分类问题(持续更新)
  • Flutter探索之旅:控制键盘可见性的神奇工具(flutter_keyboard_visibility)
  • 提升质量透明度,动力电池企业的数据驱动生产实践 | 数据要素 × 工业制造
  • 华为数通 HCIP-Datacom H12-831 题库补充
  • tensorflow中显存分配
  • STM32--RC522学习记录
  • 函数封装冒泡排序
  • mysql基础学习
  • mybatisplus提示:Property ‘mapperLocations‘ was not specified.
  • 【STL源码剖析】【2、空间配置器——allocator】
  • 机器人|逆运动学问题解决方法总结
  • php搭建websocket
  • maven install报错原因揭秘:‘parent.relativePath‘指向错误的本地POM文件
  • 数据结构·排序
  • Python学习笔记01
  • Java学习笔记01