0. 개요
몬스터를 처치하면 티어에 따라 아이템이 드랍되도록 한다.
1. 드랍 아이템의 정보를 가지는 클래스 생성
(1) DataAsset을 상속받는 C++ 클래스 생성
데이터 에셋으로 사용할 C++ 클래스인 LootTiers 클래스를 생성한다.
(2) 아이템 드랍 정보 구조체 선언
USTRUCT(BlueprintType)
struct FLootItem
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Item|Spawning")
TSubclassOf<AActor> LootClass;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Item|Spawning")
float ChanceToSpawn = 0.f;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Item|Spawning")
int32 MaxNumberToSpawn = 0;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Item|Spawning")
bool bLootLevelOverride = true;
};
아이템에 대한 클래스, 확률, 최대 드랍 갯수, 드랍 레벨을 가지는 구조체를 만든다.
(3) LootTiers 클래스
UCLASS()
class AURA_API ULootTiers : public UDataAsset
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
TArray<FLootItem> GetLootItems();
public:
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="Item|Spawning")
TArray<FLootItem> LootItems;
};
#include "AbilitySystem/Data/LootTiers.h"
TArray<FLootItem> ULootTiers::GetLootItems()
{
TArray<FLootItem> ReturnItems;
for (auto& Item : LootItems)
{
// 각 아이템의 최대 드랍 개수
for (int32 i = 0; i < Item.MaxNumberToSpawn; ++i)
{
// 확률 계산
if (FMath::FRandRange(1.f, 100.f) < Item.ChanceToSpawn)
{
// 새로운 아이템을 생성하여 배열에 추가
FLootItem NewItem;
NewItem.LootClass = Item.LootClass;
NewItem.bLootLevelOverride = Item.bLootLevelOverride;
ReturnItems.Add(NewItem);
}
}
}
return ReturnItems;
}
배열에 있는 아이템의 정보를 활용하여 최대 갯수만큼의 루프를 돌고 확률을 계산하여 ReturnItems 배열에 추가한 후 배열을 리턴한다.
2. 아이템 드랍 함수
아이템 드랍은 몬스터 별로 어떤 아이템을 드랍할지 정하는 등의 편의성을 위해 블루프린트로 관리할 것이다.
(1) AuraEnemy에서 아이템 드랍 블루프린트 이벤트 함수 선언
UFUNCTION(BlueprintImplementableEvent)
void SpawnLoot();
(2) AuraEnemy가 사망하면 아이템 드랍 이벤트 호출
void AAuraEnemy::Die(const FVector& DeathImpulse)
{
// 수명 설정
SetLifeSpan(LifeSpan);
if (AuraAIController)
{
// 블랙보드 키 기본값 설정
AuraAIController->GetBlackboardComponent()->SetValueAsBool(FName("Dead"), true);
}
// 아이템 드랍
SpawnLoot();
// 랙돌 효과와 무기 드랍
Super::Die(DeathImpulse);
}
(3) AuraGameModeBase 드랍 아이템을 게임모드에서 관리
UPROPERTY(EditDefaultsOnly, Category="Item")
TObjectPtr<ULootTiers> LootTiers;
(4) AuraAbilitySystemLibrary에서 게임모드의 드랍 아이템 배열을 가져오기
// 드랍 아이템 정보 가져오기
UFUNCTION(BlueprintCallable, category = "AuraAbilitySystemLibrary|AbilityInfo")
static ULootTiers* GetLootTiers(const UObject* WorldContextObject);
ULootTiers* UAuraAbilitySystemLibrary::GetLootTiers(const UObject* WorldContextObject)
{
AAuraGameModeBase* AuraGameMode = Cast<AAuraGameModeBase>(UGameplayStatics::GetGameMode(WorldContextObject));
if (AuraGameMode == nullptr)
return nullptr;
return AuraGameMode->LootTiers;
}
(5) DA_LootTiers 데이터 에셋 블루프린트
테스트를 위해 체력 포션을 100% 확률로 3개 드랍하도록 지정한다.
(6) BP_AuraGameMode에서 Loot Tiers 지정
3. 아이템 드랍
(1) 멤버 변수 설정
게임모드의 DA_LootTiers 를 가져와 각 아이템의 드랍 확률에 따라 계산하여 배열로 저장한다.
라이브러리의 Evenly Spaced Rotators 함수를 활용하여 로테이터 배열을 생성한다.
타이머를 이용하여 루프를 할 것이므로, 카운트를 0으로 세팅한다.
(2) 타이머 설정
매 0.1초마다 커스텀 이벤트가 호출될 것이다.
배열을 순회하여 배열의 끝에 도달하면 타이머를 정리한다.
(3) 루프
배열을 순회한다.
각 요소의 트랜스폼을 이용해 액터를 스폰한다.
이 함수는 Evenly Spaced Rotators 함수에 의해 생성된 로테이터 배열을 순회한다.
로테이터의 전방 벡터와 일정 값을 곱한 값을 죽은 몬스터의 위치에 더하여 아이템의 로케이션으로 적용한다.
로테이터의 회전 값을 아이템의 로테이션으로 적용한다.
(3-1) 효과 액터의 레벨 오버라이드
물약, 크리스탈과 같은 액터는 bLootLevelOverride의 값에 따라 레벨을 직접 지정할 수 있다.
모든 경우에 대해 카운트를 1 더하도록 지정한다.
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
30-12. 아이템 - (3) 드랍 아이템 효과 (0) | 2025.04.17 |
---|---|
30-11. 아이템 - (2) 드랍 아이템의 운동 (0) | 2025.04.16 |
30-9. 레벨 디자인 - (2) 플레이어 사망 (0) | 2025.04.16 |
30-8. 레벨 디자인 - (1) 몬스터 소환 볼륨 (0) | 2025.04.15 |
30-7. 맵 이동 - (7) 모델링 모드 - 던전 입구 계단 (0) | 2025.04.15 |