[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

+ Recent posts