언리얼 엔진 - 게임 프로젝트/GAS 프레임워크 RPG 프로젝트

게임 맵 - 4) 아이템 드롭

monstro 2026. 1. 12. 23:23
728x90
반응형

- 개요

적을 쓰러트리면 아이템을 드롭하는 시스템을 추가한다

 

- C++ 사이드

1) LootTiers 클래스

LootItem 구조체

 

적이 드롭하는 아이템으로 사용하는 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 클래스

새롭게 추가 (1)

 

새롭게 추가 (2)

 

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 이벤트 (1)

 

SpawnLoot 이벤트의 로직을 위와 같이 구성하여

드롭할 수 있는 아이템을 대상으로 0.1초 간격으로 SpawnLootItem 이벤트를 호출한다

 

SpawnLoot 이벤트 (2)

 

Timer에 바인드되는 이벤트의 로직을 위와 같이 구성한다

LootItems저장된 아이템들을 하나씩 꺼내와 설정하고 더 이상 꺼내올 수 없다면 타이머를 해제한다

 

- 최종 실행 결과

 

728x90
반응형