[57. HUD #7]
전력질주 시 스태미너가 감소하게 될텐데, 일반적인 게임에서는 스태미너를 사용하면 일정시간 회복되지 않다가 뒤늦게 회복을 시작하거나 스태미너의 잔여량이 특정 구간(ex:20%)을 지나면 게이지의 색상이 변한다던지 하는 경우가 많다.
지금은 특정 구간에 따른 색상 변화를 구현해 보도록 하자.
스태미너가 최소치를 초과한 상태, 최소치 이하인 상태, 0인 상태, 0에서 회복중인 상태 4개로 구분한다.
// Main.h
UENUM(BlueprintType)
enum class EStaminaStatus : uint8
{
ESS_Normal UMETA(DisplayName="Normal"),
ESS_BelowMinimum UMETA(DisplayName="BelowMinimum"),
ESS_Exhausted UMETA(DisplayName="Exhausted"),
ESS_ExhaustedRecovering UMETA(DisplayName="ExhaustedRecovering"),
ESS_MAX UMETA(DisplayName="DefaultMax")
};
스태미너의 색상 구분을 위해 enum class를 새로 추가한다.
// Main.h
publuc:
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category="Enums")
EStaminaStatus StaminaStatus;
FORCEINLINE void SetStaminaStatus(EStaminaStatus Status) { StaminaStatus = Status; }
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")
float StaminaDrainRate;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")
float MinSprintStamina;
// Main.cpp
AMain::AMain()
{
//Initialize Enums
MovementStatus = EMovementStatus::EMS_Normal;
StaminaStatus = EStaminaStatus::ESS_Normal;
StaminaDrainRate = 25.f;
MinSprintStamina = 50.f;
}
void AMain::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
float DeltaStamina = StaminaDrainRate * DeltaTime;
switch (StaminaStatus)
{
case EStaminaStatus::ESS_Normal:
if (bShiftKeyDown)
{
if (Stamina - DeltaStamina <= MinSprintStamina)
{
SetStaminaStatus(EStaminaStatus::ESS_BelowMinimum);
Stamina -= DeltaStamina;
}
else
{
Stamina -= DeltaStamina;
}
SetMovementStatus(EMovementStatus::EMS_Sprinting);
}
else
{
if (Stamina + DeltaStamina >= MaxStamina)
{
Stamina = MaxStamina;
}
else
{
Stamina += DeltaStamina;
}
SetMovementStatus(EMovementStatus::EMS_Normal);
}
break;
case EStaminaStatus::ESS_BelowMinimum:
if (bShiftKeyDown)
{
if (Stamina - DeltaStamina <= 0.f)
{
SetStaminaStatus(EStaminaStatus::ESS_Exhausted);
Stamina -= 0.f;
SetMovementStatus(EMovementStatus::EMS_Normal);
}
else
{
Stamina -= DeltaStamina;
SetMovementStatus(EMovementStatus::EMS_Sprinting);
}
}
else
{
if (Stamina + DeltaStamina >= MinSprintStamina)
{
SetStaminaStatus(EStaminaStatus::ESS_Normal);
Stamina += DeltaStamina;
}
else
{
Stamina += DeltaStamina;
}
SetMovementStatus(EMovementStatus::EMS_Normal);
}
break;
case EStaminaStatus::ESS_Exhausted:
if (bShiftKeyDown)
{
Stamina = 0.f;
}
else
{
SetStaminaStatus(EStaminaStatus::ESS_ExhaustedRecovering);
Stamina += DeltaStamina;
}
SetMovementStatus(EMovementStatus::EMS_Normal);
break;
case EStaminaStatus::ESS_ExhaustedRecovering:
if (Stamina + DeltaStamina >= MinSprintStamina)
{
SetStaminaStatus(EStaminaStatus::ESS_Normal);
Stamina += DeltaStamina;
}
else
{
Stamina += DeltaStamina;
}
SetMovementStatus(EMovementStatus::EMS_Normal);
break;
}
}
키 눌림과 스태미너의 잔여량에 따라 상태를 계속 변경해준다.
Progress bar의 색상까지 위와 같이 바인딩 해주면 색상 변화가 잘 된다.
[58. Array and Debug Spheres]
디버깅에 도움을 줄 수 있는 기능들이 있다.
먼저 알아볼 것은 특정 위치에 사각형이나 구체 등등의 기하학적인 물체를 띄우는 것이다.
#include "Kismet/KismetSystemLibrary"
//(오브젝트, 위치, 반지름, 세그먼트, 색상, 지속시간, 선의 두께)
UKismetSystemLibrary::DrawDebugSphere(this, GetActorLocation() + FVector(0.f, 0.f, 75.f), 25.f, 8, FLinearColor::Red, 5.f, .25f);
배열 대신 TArray를 사용하여 조금 더 많은 기능과 신속성, 메모리 효율성, 안정성을 챙길 수 있다.
[정리]
- 디버그 함수를 이용해서 디버깅을 하는데 도움을 받을 수 있다.
- TArray는 가장 많이 쓰이는 컨테이너 중 하나이다.
'언리얼 엔진 > UE4 C++' 카테고리의 다른 글
[UE C++] Combat #2 (0) | 2022.09.11 |
---|---|
[UE C++] Combat #1 (0) | 2022.09.10 |
[UE C++] Gameplay Mechanics #6 (0) | 2022.09.09 |
[UE C++] Gameplay Mechanics #5 (0) | 2022.09.08 |
[UE C++] Gameplay Mechanics #4 (0) | 2022.09.08 |