2026.01.26

박민재 (Daype)·2026년 1월 26일
post-thumbnail

학습목표

  • SpawnVolume 상속받는 클래스를 통해 지정된 범위내에 아이템을 생성할 수 있다.
  • DataTable 을 사용해서 Spawn 하려는 아이템들의 정보를 쉽게 불러서 사용할 수 있다.
  • SpawnVolumeDataTable 을 이용해서 각 레벨별로 아이템 랜덤생성 로직을 구현할 수 있다.

아이템 스포너 만들기

언리얼 엔진에서 아이템을 랜덤으로 스폰하는 방법은 다양하다 오늘 구현해볼 방법은 그중에서도 간단하게 CollisionComponent 를 이용하여 구현해볼 것이다.

CollisionComponent : 언리얼엔진에서 제공하는 충돌관련 이벤트를 처리해주는 컴포넌트

  • 해당 컴포넌트를 사용해서 구현을 하게될경우 추후에 캐릭터가 해당 Collision 이벤트가 일어날경우 스폰이되거나, Collision 인식이 안될경우 스폰을 비활성 하는 등 추가적인 로직을 구현하기 편리하다는 장점이있다.

C++ SpawnVolume 파일을 생성한 후 필요한 컴포넌트들을 부착해준다

TObjectPtr 사용, RootComponent 로 사용할 SceneComponent 스폰범위와 이벤트를 담당할 BoxComponent , 사용할 아이템들의 정보를 몽아놓은 DataTable 선언

TObjectPtr : 언리얼 엔진에서 제공하는 강한참조로 원시포인터 대체용으로 사용하는데 에디터 빌드에서 수행되는기능도 존재함과 동시에 비에디터 빌드시 원시포인터로 변환되어서 기능적으로 문제를 일으키지 않는 이중역할을 맡는 포인터이다.

cpp 파일 내 생성자 할당

아이템 데이터 관리를 위해 데이터테이블 만들기

데이터 테이블 같은경우 비UObject이기 때문에 C++ 클래스 생성시 None 옵션으로 아무것도 상속받지않고 생성한다.

이후 언리얼에서 사용하는 구조체로 만들어주기위해 USTRUCT() 매크로를 부착해주고 FTableRowBase 를 상속받게해준다 이후 구조체 내부 작성 FName 이름변수 TSubclassof 클래스 변수 float SpawnChance 변수 할당 구조체이기 때문에 내부구현은 필요없으나 언리얼엔진이 쉽게 인식하기위해 Cpp파일 놔두기

USTRUCT() : 구조체를 언리얼엔진에 등록하기위한 매크로, BlueprintType를 사용해 블루프린트상에서 사용가능하게 만들기
FTableRowBase : 이 구조체는 데이터 테이블로 쓸 수 있다 라고 인식하게 해줌
TSubclassOf : 원시포인터보다 안전하게 사용하기위해 사용하며, 선언한 타입의 하위 클래스에 안전하게 접근가능

이후 엔진에서 해당 구조체를 RowStruct로 받아서 데이터 테이블 작성

아이템 랜덤 스폰함수 구현

스폰에 필요한 함수들을 선언후 cpp에서 내부 구현

Spawn 범위 지정후 반환

GetWorld 내부에 SpawnActor 함수 사용

알고리즘:Accumulate사용하여 랜덤아이템반환

최종 아이템 스폰

Accumulate : 알고리즘을 구현한 함수로 0~1사이에 값으로 스폰 확률을 정의하는 알고리즘이다
ex) 소환확률[아이템1 : 0.5 ,아이템2 : 0.2, 아이템3 : 0.3] 총합은 1 == 100% 가 되어야하고 이후 FRandRange를 이용해 0과 1사이에서 값을 추출한후 해당 값이 0~0.5일경우 아이템1 스폰 0.5~0.8일경우 아이템3 스폰 0.8 ~ 1 사이일경우 아이템2 가 스폰되는 알고리즘

GetRandomPointInVolume : 스폰 범위를 나타내는 상자의 전체 크기를 가져온 후 중앙에서 끝까지 절반거리를 구한 다음 절반기준 음수방향과 양수방향끝거리를 랜덤으로 지정 이럴 경우 범위의 지름 안에 랜덤한 곳을 좌표로 반환받을 수 있음.

구현완료

0개의 댓글