Unreal/언리얼 엔진 5로 개발하는 멀티플레이어 게임(Book)

[Unreal] US_Character Class 코드 분석(데이터 테이블 읽기)

suppresswisely 2025. 3. 25. 13:40

US_Character.h

UCLASS()
class UNREALSHADOWS_LOTL_API AUS_Character : public ACharacter
{
    ...

    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Character Data", meta = (AllowPrivateAccess = "true"))
    class UDataTable* CharacterDataTable;

    struct FUS_CharacterStats* CharacterStats;

    ...
    
public:
    ...

    void UpdateCharacterStats(int32 CharacterLevel);

    FORCEINLINE FUS_CharacterStats* GetCharacterStats() const { return CharacterStats; }

    ...
}

 

  • CharacterDataTable: 블루프린트 에서 데이터 테이블을 직접 참조할 수 있게 해준다.
  • CharacterStats: 구조체 선언은 데이터 테이블에서 단일 행을 참조해 캐릭터 스탯으로 활용하게 해준다.

US_Character.cpp

void AUS_Character::UpdateCharacterStats(int32 CharacterLevel)
{
    if (CharacterDataTable)
    {
        TArray<FUS_CharacterStats*> CharacterStatsRows;
        CharacterDataTable->GetAllRows<FUS_CharacterStats>(TEXT("US_Character"), CharacterStatsRows);

        if (CharacterStatsRows.Num() > 0)
        {
            const auto NewCharacterLevel = FMath::Clamp(CharacterLevel, 1, CharacterStatsRows.Num());
            CharacterStats = CharacterStatsRows[NewCharacterLevel - 1];

            GetCharacterMovement()->MaxWalkSpeed = GetCharacterStats()->WalkSpeed;
        }
    }
}

 

 

  • GetAllRow<T>(): 멤버 함수를 사용해 테이블의 모든 행을 지역 배열로 가져온다.
  • FMath::Clamp: 값을 Min과 Max 사이로 제한한다. 즉 CharacterLevel을 1에서 CharacterStatsRows.Num()까지 제한 한다.
  • CharacterStatsRows[NewCharacterLevel - 1]: 캐릭터의 레벨이 1이면 행번호는 0이되도록 -1을 한다.
  • GetCharacterMovement()->MaxWalkSpeed = GetCharacterStats()->WalkSpeed: 실제로 캐릭터의 속도에 적용한다.