2026-05-19(화) DataTable, 동적생성 위젯, RandPointInCircle

조범근·2026년 5월 19일

TIL

목록 보기
61/81

C++ Week 12

Study

팀프로젝트



Today I Learned


UnrealC++

1. FindOrAdd

UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Trait")
TObjectPtr<UDataTable> traitDataTable;

// cpp

if (!IsValid(traitDataTable)) return;

const TArray<FName> rowNames = traitDataTable->GetRowNames();

for (const FName& rowName : rowNames)
{
    const FTraitData* traitData =
        traitDataTable->FindRow<FTraitData>(
            rowName,
            TEXT("OutGameTraitWidget CreateTraitCards")
        );

    if (traitData == nullptr) continue;

    // traitData 사용
}

언리얼 DataTable은 보통 C++에서 직접 경로로 찾기보다, 변수만 열어두고 블루프린트/WBP에서 할당하는 방식이 편하다.

FindRow<TraitData>()특정 RowName에 해당하는 FTraitData 한 줄을 찾아오는 함수이다. 뒤에 TEXT는 찾는 키가 아니라 로그용 Context 문자열 만약 RowName이 잘못됐을 때 로그에는

requested row 'Trait_X' not in DataTable
Context: OutGameTraitWidget CreateTraitCards

이렇게 나옴. 즉 디버깅용 이름표라고 보면 된다.




동적 생성 위젯

동정 생성 위젯 흐름

  1. 위젯 클래스 변수 준비
  2. CreateWidget으로 인스턴스 생성
  3. 데이터 초기화
  4. 델리게이트 바인딩
  5. Panel에 AddChild

const TArray<FName> rowNames = traitDataTable->GetRowNames();로 선언해둔 다음 DT_파일을 지정해준 다음

const TArray<FName> rowNames = traitDataTable->GetRowNames();으로 모든 rowName을가져와

TObjectPtr<UUniformGridPanel> cardContainer; UniformGridPanel로 생성해둔 cardContainer를 cardContainer->AddChildToUniformGrid(traitCard, row, column);

const int32 ColumnCount = 3;

int32 Index = 0;

for (const FName& rowName : rowNames)
{
    const int32 Row = Index / ColumnCount;
    const int32 Column = Index % ColumnCount;

    cardContainer->AddChildToUniformGrid(traitCard, Row, Column);

    ++Index;
}

Index 0 -> Row 0, Column 0
Index 1 -> Row 0, Column 1
Index 2 -> Row 0, Column 2
Index 3 -> Row 1, Column 0

이렇게 동적 생성은 C++에서 WBP 인스턴스를 만들고, Panel에 자식으로 넣는것이다.


traitCards.Add(traitCard)

C++ STL의 vector.push_back()이랑 또같은 기능

TArray 의 push_back이지만 Add()는 추가한 위치의 index를 반환하기도 한다.




RandPointInCircle

const FVector2D randomCircle = FMath::RandPointInCircle(MeteorSpawnRadius); 이건 현재 구현되어있는 meteorSpawnRadius = meteor가 떨어졌을때 터지는 범위 안에서 랜덤한2D좌표를 뽑는 함수이다.

플레이어 근처의 좌표를 넣지않아도 어떻게 실시간으로 갱신이 되는 거냐면 MeteorSpawnRadius = 800 이런식으로 정해두고 이 범위 안에서 랜덤한 좌표를 뽑아 나중에 플레이어캐릭터의 현재 좌표에 더해서 사용한다.

FVector spawnLocation = playerCharacter->GetActorLocation();

spawnLocation.X += randomCircle.X;
spawnLocation.Y += randomCircle.Y;

플레이어 위치 가져오기
→ 원 안의 랜덤 오프셋 생성
→ 플레이어 위치 + 랜덤 오프셋
→ 플레이어 주변 랜덤 위치 완성

0개의 댓글