- 개요
적을 쓰러트리면 아이템을 드롭하는 시스템을 추가한다
- C++ 사이드
1) LootTiers 클래스

적이 드롭하는 아이템으로 사용하는 LootItem 구조체를 추가한다
멤버변수의 구성은 다음과 같다
- LootClass 멤버변수 : 드롭할 아이템의 클래스
- ChanceToSpawn 멤버변수 : 아이템을 드롭할 확률
- MaxNumberToSpawn 멤버변수 : 최대로 드롭할 개수
- bLootLevelOverride 멤버변수 : 드롭할 아이템이 겹쳐질지 여부

드롭가능한 아이템을 모아놓은 데이터 애셋으로 사용할 LootTiers 클래스를 생성한다
멤버변수의 구성은 다음과 같다
- LootItems 멤버변수 : 드롭할 아이템의 LootItem을 모아놓은 TArray

GetLootItems 함수의 로직은 위와 같다
LootItems 멤버변수를 순회하면서 순회중인 LootItem의 MaxNumberToSpawn 만큼 다음의 로직을 반복한다
- ChancToSpawn의 확률만큼 LootItem을 생성하고 설정하여 임시 컨테이너에 저장
- 2개의 반복문이 종료된 후에 임시 컨테이너를 반환
2) AuraGameInstance 클래스

LootTiers 멤버변수를 추가하여 GameInstance에서 드롭할 수 있는 아이템에 접근할 수 있도록 설정한다
3) AuraAbilitySystemLibrary 클래스


GetLootTiers 함수를 추가하여 GameInstance를 거쳐 LootTiers를 반환할 수 있도록 설정한다
4) AuraEnemy 클래스

SpawnLoot 함수를 추가하고 블루프린트에서 정의하여 아이템을 드롭할 수 있도록 설정한다

Die 함수에 위의 로직을 추가하여 적이 쓰러지면서 아이템을 드롭할 수 있도록 설정한다
5) AuraEffectActor 클래스


AuraEffectActor 클래스에 위와 같이 추가하여 드롭된 아이템이 sin 함수처럼 선형적으로 움직일 수 있도록 설정한다
멤버변수의 구성은 다음과 같다
- CalculatedLocation 멤버변수 : 최종 계산된 위치값
- CalculatedRotation 멤버변수 : 최종 계산된 회전값
- bRotates 멤버변수 : 회전할지 여부
- RotationRate 멤버변수 : 회전의 주기
- bSinusoidalMovement 멤버변수 : sin 함수처럼 움직일지 여부
- SineAmplitude 멤버변수 : 계산된 sin 값에 대한 보간값
- SinePeriodConstant 멤버변수 : sin 함수에서 사용할 인자값
- InitialLocation 멤버변수 : 초기 위치값
- RunningTime 멤버변수 : 움직이는 주기값

Tick 함수의 로직은 위와 같이 구성하여 매 프레임마다 RunningTime을 누적한다
이때 SinPeriod 값의 주기를 넘어서면 값을 초기화하고 ItemMovement 함수를 호출한다

BeginPlay 함수에 로직을 추가하여 InitialLocation + CalculatedLocation + CalculatedRotation 값을 설정한다

ItemMovement 함수의 로직은 위와 같다
회전값과 sin 함수처럼 위아래로 이동하는 위치값을 계산한다

StartSinusoidalMovement 함수의 로직은 위와 같다
bSinusoidalMovement의 값을 True로 바꾸고, 이동의 중심이 될 현재 위치를 다시 설정한다

StartRotation 함수의 로직은 위와 같이 구성하여
bRotates의 값을 True로 바꾸고, 회전의 중심이 될 현재 회전을 다시 설정한다
- 블루프린트 사이드
1) DA_LootTiers 데이터애셋

위와 같이 드롭할 수 있는 아이템과 관련된 설정을 추가한다
2) BP_AuraGameInstance 블루프린트

1)에서 생성한 데이터 애셋을 LootTiers 멤버변수에 설정한다
3) BP_PickupBase 블루프린트

드롭할 수 있는 아이템들의 부모 클래스로 사용할 BP_PickupBase 블루프린트를 생성한다
EventGraph의 로직은 위와 같이 구성하였다
- BeginPlay 이벤트 : StartSinusoidalMovement 함수 + StartRotation 함수 호출
- Tick 이벤트 : SetActorLocation 함수 + SetActorRotation 함수 호출
4) BP_EnemyBase 블루프린트
4 - 1) GetLootTransform 함수

GetLootTransform 함수를 위와 같이 작성하여
LootRotations에 저장된 Rotator를 선택하고 그 방향으로 랜덤한 거리만큼 떨어진 위치를 계산한다
4 - 2) EventGraph - SpawnLoot 함수

SpawnLoot 이벤트의 로직을 위와 같이 구성하여
드롭할 수 있는 아이템을 대상으로 0.1초 간격으로 SpawnLootItem 이벤트를 호출한다

Timer에 바인드되는 이벤트의 로직을 위와 같이 구성한다
LootItems에 저장된 아이템들을 하나씩 꺼내와 설정하고 더 이상 꺼내올 수 없다면 타이머를 해제한다
- 최종 실행 결과
'언리얼 엔진 - 게임 프로젝트 > GAS 프레임워크 RPG 프로젝트' 카테고리의 다른 글
| 게임 맵 - 3) 몬스터 스포너와 맵 재시작 구현 (0) | 2026.01.11 |
|---|---|
| 게임 맵 - 2) 던전 구조물과 입구 추가 (0) | 2026.01.10 |
| 게임 맵 - 1) 커서 동작 수정 (0) | 2026.01.09 |
| 체크 포인트 - 최종) 월드 저장하고 불러오기 (0) | 2026.01.09 |
| 체크 포인트 - 3) GameplayAbility 저장 + 불러오기 (0) | 2026.01.02 |