任务:将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数据