先看一下最终效果
上面红色的就是血条啦,在游戏运行的时候可以随血量增加减少而使红色部分的长度发生变化
一、首先说明,我的Character是在c++中建立的,各个组件都是在c++中添加的,所以血条也是在蓝图中画好后加到c++里的。
二、先画一个血条:创建一个widget,添加一个ProgressBar组件即可:调好位置(尽量调到(500,500)以内,原因在“四、5”中说明),“Bar Fill Type”就是血量变化的方向,可以根据需要进行选择,其他的属性可以自行选择更改,如图:
三、现在进入c++中,首先在.h文件中声明WidgetComponent组件以及其他要用到的函数和变量:
//组件
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Mesh)
class UWidgetComponent* EagleBloodWidget;
//初始化完组件后调用这个函数
virtual void PostInitializeComponents() override;
//ProgressBar
UPROPERTY()
class UProgressBar *HPBarProgress;
四、编写c++代码
1.先添加头文件
#include "Components/WidgetComponent.h"
#include "Components/ProgressBar.h"
#include "Runtime/UMG/Public/Components/ProgressBar.h"
2.首先在构造函数中添加这个组件:
// 初始化EagleBloodWidget
//从蓝图中找到UserWidget这个蓝图类
static ConstructorHelpers::FClassFinder<UUserWidget> EagleBloodShow(TEXT("/Game/UMG/BP_Blood"));//注意路径要去掉.以及其后的内容
//添加组件
EagleBloodWidget = CreateDefaultSubobject<UWidgetComponent>(TEXT("EagleBlood"));
//附着
EagleBloodWidget->SetupAttachment(GetCapsuleComponent());
//选定刚找到的UserWidget来设置EagleBloodWidget
EagleBloodWidget->SetWidgetClass(EagleBloodShow.Class);
3.完善PostInitializeComponents()函数
void AEagle::PostInitializeComponents()
{
Super::PostInitializeComponents();
UUserWidget* CurrentWidget = EagleBloodWidget->GetUserWidgetObject();
if (NULL != CurrentWidget)
{
//TEXT中填写的是你在蓝图中创建的ProgressBar的名字,因为是根据名字进行寻找
HPBarProgress = Cast<UProgressBar>(CurrentWidget->GetWidgetFromName(TEXT("ProgressBar_24")));
if (NULL != HPBarProgress)
{
//设置初始的百分比,可以根据需要任意设置
HPBarProgress->SetPercent(1.f);
}
}
}
4.在需要更改血量条的时候调用
HPBarProgress->SetPercent(Percent);
我的是在Tick中写的,如下:
if (CurrentEagleBlood>=0)
{
//注意是float,int相除得到的是0,给我坑了好久
HPBarProgress->SetPercent((float)((float)CurrentEagleBlood / (float)MaxEagleBlood));//更新血条长度
}