Box Collision
Box Collision 초기화
// .h
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Spawning")
UBoxComponent* SpawningBox;
// .cpp
SpawningBox = CreateDefaultSubobject<UBoxComponent>(TEXT("SpawningBox"));
SpawningBox->SetupAttachment(Scene);
Box Collision 컴포넌트를 C++에서 초기화하는 코드이다.
Box Collision 함수
// 박스 콜리전의 반지름 값을 가져옴
FVector BoxExtent = SpawningBox->GetScaledBoxExtent();
// 박스 콜리전의 중심 좌표를 가져옴
FVector BoxOrigin = SpawningBox->GetComponentLocation();
// 활용
BoxOrigin + FVector(
FMath::FRandRange(-BoxExtent.X, BoxExtent.X),
FMath::FRandRange(-BoxExtent.Y, BoxExtent.Y),
FMath::FRandRange(-BoxExtent.Z ,BoxExtent.Z)
);
GetScaledBoxExtent 로 BoxCollision의 ( X,Y,Z 스케일 값 / 2 )을 얻어올 수 있다.
GetComponentLocation 로 중심 좌표를 얻어올 수 있다.
이 2개의 함수를 활용해서 Box Collision 영역 내에 랜덤한 좌표를 얻어오는 코드를 작성할 수 있다.
데이터 테이블
데이터테이블 C++
#pragma once
#include "CoreMinimal.h"
#include "ItemSpawnRow.generated.h"
USTRUCT(BlueprintType)
struct FItemSpawnRow : public FTableRowBase
{
GENERATED_BODY()
public:
// 아이템 이름
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FName ItemName;
// 아이템 클래스
UPROPERTY(EditAnywhere, BlueprintReadWrite)
TSubclassOf<AActor> ItemClass;
// 아이템 확률
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float SpawnChance;
};
USTRUCT로 언리얼엔진에서 해당 데이터테이블 클래스를 인식할 수 있게끔 선언하고, BlueprintType을 매개변수로 하여 FItemSpawnRow 구조체를 변수로 만들어주었다.
일반 클래스와 다르게 FTableRowBase 를 상속받아야 하며, 네이밍 규칙으로 클래스 앞에 "F"를 붙여야 한다는 특징이 있다.
데이터테이블 생성
결과
생성한 데이터테이블을 통해 데이터들을 추가해주었다.
유니티에서는 csv 파일을 직접 읽어오는 과정이 필요했는데, 언리얼에서는 엔진 내에서 직접 데이터테이블을 관리할 수 있게 해준다. 강력한 기능인 것 같다.
데이터테이블 읽어오기
C++
//.h
// 데이터테이블
UPROPERTY(EditAnywhere, BlueprintReadOnly)
UDataTable* ItemDataTable;
// 데이터테이블 구조체를 반환하는 함수
FItemSpawnRow* GetRandomItem() const;
//.cpp
// 데이터테이블 각각의 행을 받아오기위한 변수
TArray<FItemSpawnRow*> AllRows;
// 데이터테이블을 읽어오는 과정에서 문제가 생긴 경우 출력할 문자열
static const FString ContextString(TEXT("ItemSpawnContext"));
// 데이터테이블의 모든 행을 AllRows에 받아옴
ItemDataTable->GetAllRows(ContextString, AllRows);
AllRows[0]->ItemClass
AllRows[0]->SpawnChance
AllRows[0]->ItemName
GetAllRows에 ContextString을 인자로 추가해야 한다는 점이 특징인데, 덕분에 디버깅이 수월하다는 장점이 있다.
느낀 점
데이터테이블을 엔진 내에서 관리하는 기능은 현업에서 아주 유용하게 쓰일 것 같네요 ! 다만, 데이터테이블로 인해 충돌이 발생할 수도 있다는 점에서 조금 조심할 필요는 있겠어요 !
언리얼 엔진에 익숙해지고, 팀을 꾸려서 게임을 만들 때 꼭 활용해봐야겠습니다 !
'언리얼 엔진 > 스파르타코딩클럽' 카테고리의 다른 글
[언리얼엔진] 4-1. UI 위젯 설계와 실시간 데이터 연동 (0) | 2025.02.10 |
---|---|
[언리얼엔진] 3-5. 게임 루프 설계 (0) | 2025.02.07 |
[언리얼엔진] 3-4. 캐릭터 체력 및 점수 시스템 구현 (0) | 2025.02.06 |
[언리얼엔진] 3-2. 충돌 이벤트로 획득하는 아이템 구현 (0) | 2025.02.04 |
[언리얼엔진] 3-1. 캐릭터 구현 (1) | 2025.01.27 |