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,做相应的逻辑操作。

五.效果

相关推荐

  1. Unity3D MMORPG角色的UI管理详解

    2024-03-23 10:02:02       21 阅读
  2. Unity3D MMORPG角色的UI管理详解

    2024-03-23 10:02:02       8 阅读
  3. UI跟随3D人物

    2024-03-23 10:02:02       35 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-23 10:02:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-23 10:02:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-23 10:02:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-23 10:02:02       20 阅读

热门阅读

  1. 7-24 两个整数最大值

    2024-03-23 10:02:02       17 阅读
  2. 关于RestController发送请求用List<T> 接收数据

    2024-03-23 10:02:02       21 阅读
  3. ChatGPT PLUS 团队版 和 ChatGPT PLUS 比较

    2024-03-23 10:02:02       30 阅读
  4. Linux常用通配符

    2024-03-23 10:02:02       16 阅读
  5. 学“计算机专业”的女生毕业后能做什么工作?

    2024-03-23 10:02:02       17 阅读
  6. 3.0 V-22V 宽输入电压,高效率异步升压芯片-ZCC5429

    2024-03-23 10:02:02       22 阅读
  7. 奶牛选美(dfs)

    2024-03-23 10:02:02       19 阅读
  8. 代码随想录Day31

    2024-03-23 10:02:02       21 阅读
  9. Qt平台插件“xcb“加载失败问题及其解决方案

    2024-03-23 10:02:02       16 阅读
  10. shentou思路流程

    2024-03-23 10:02:02       18 阅读
  11. 【高并发服务器 02】——线程池与IO多路复用

    2024-03-23 10:02:02       19 阅读