UE4 C++学习笔记之使用UMG(下)

任务:将UI界面中的体力条与玩家体力值相关联,并制作相关的体力消耗机制

第一步、项目设置添加相关操作映射Sprint

第二步、在C++角色类中(我这里是Man)修改相关代码

Man.h关键部分代码如下:

//定义枚举类型EStatus,表示当前玩家状态,有正常和加速两种状态
UENUM(BlueprintType)
enum class EStatus : uint8
{
	ES_Normal UMETA(DisplayName="Normal"),
	ES_Sprint UMETA(DisplayName="Sprint"),
};

UCLASS()
class LEARNTEST_API AMan : public ACharacter
{
	GENERATED_BODY()
        
        ……

public:
        //定义浮点类型:存储当前体力值
	UPROPERTY(BlueprintReadWrite)
	float Stamina;

        //定义浮点类型:存储最大的体力值
	UPROPERTY(BlueprintReadWrite)
	float MaxStamina;

        //定义浮点类型:存储体力变化率
	UPROPERTY(BlueprintReadWrite)
	float StaRate;

        //定义枚举类型EStatus,储存当前玩家状态
	UPROPERTY(BlueprintReadWrite)
	EStatus CurrentStatus;

        //定义布尔变量,监控玩家是否处于疲惫状态
	UPROPERTY(BlueprintReadWrite)
	bool bExhausted;

        //定义函数:设置玩家状态,需要传入想要设置的状态类型
	UFUNCTION(BlueprintCallable)
	void SetStatus(EStatus Status);

        //定义函数:开始奔跑
        UFUNCTION()
	void BeginSprint();

        //定义函数:结束奔跑
        UFUNCTION()
	void EndSprint();

        ……

};

Man.cpp关键代码如下:

//定义函数:设置角色状态
void AMan::SetStatus(EStatus Status)
{
	    //设置当前角色状态
        CurrentStatus = Status;

        //根据当前角色状态设置最大移动速度
	switch (CurrentStatus)
	{
	case EStatus::ES_Normal:
		GetCharacterMovement()->MaxWalkSpeed = 300;
		break;
	case EStatus::ES_Sprint:
		GetCharacterMovement()->MaxWalkSpeed = 600;
		break;
	default:
		break;
	}
}

//定义函数:开始奔跑
void AMan::BeginSprint()
{
	    //如果角色不疲惫,则进入奔跑状态
    if (!bExhausted)
		SetStatus(EStatus::ES_Sprint);
}

//定义函数:结束奔跑
void AMan::EndSprint()
{
        //进入正常状态
	SetStatus(EStatus::ES_Normal);
}

void AMan::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);

        ……

        //新增按键绑定事件
	PlayerInputComponent->BindAction("Sprint", IE_Pressed, this, &AMan::BeginSprint);
	PlayerInputComponent->BindAction("Sprint", IE_Released, this, &AMan::EndSprint);
}

//每一帧根据角色状态改变体力值
void AMan::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);	

        //角色体力值变化算法
	switch (CurrentStatus)
	{
		case EStatus::ES_Normal:
			if (Stamina < MaxStamina)
			{
				Stamina += DeltaTime * StaRate;
			}
			if (Stamina > MaxStamina)
			{
				Stamina = MaxStamina;
				bExhausted = false;
			}
			
			break;
		case EStatus::ES_Sprint:
			Stamina -= DeltaTime * StaRate;
			if (Stamina < 0)
			{
				Stamina = 0;
				SetStatus(EStatus::ES_Normal);
				bExhausted = true;
			}
			break;
		default:
			break;
	}
}

第三步、在UI控件中绑定体力条与角色Stamina数据

猜你喜欢

转载自blog.csdn.net/weixin_44928892/article/details/108223948