팀프로젝트
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
이렇게 나옴. 즉 디버깅용 이름표라고 보면 된다.
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에 자식으로 넣는것이다.
C++ STL의 vector.push_back()이랑 또같은 기능
TArray 의 push_back이지만 Add()는 추가한 위치의 index를 반환하기도 한다.
const FVector2D randomCircle = FMath::RandPointInCircle(MeteorSpawnRadius); 이건 현재 구현되어있는 meteorSpawnRadius = meteor가 떨어졌을때 터지는 범위 안에서 랜덤한2D좌표를 뽑는 함수이다.
플레이어 근처의 좌표를 넣지않아도 어떻게 실시간으로 갱신이 되는 거냐면 MeteorSpawnRadius = 800 이런식으로 정해두고 이 범위 안에서 랜덤한 좌표를 뽑아 나중에 플레이어캐릭터의 현재 좌표에 더해서 사용한다.
FVector spawnLocation = playerCharacter->GetActorLocation();
spawnLocation.X += randomCircle.X;
spawnLocation.Y += randomCircle.Y;
플레이어 위치 가져오기
→ 원 안의 랜덤 오프셋 생성
→ 플레이어 위치 + 랜덤 오프셋
→ 플레이어 주변 랜덤 위치 완성