[UE5] Lena: Dev Diary #18 - 드래그 앤 드롭을 통한 인벤토리 및 무기 관리 기능 개선

ChangJin·2024년 8월 20일
1

Unreal Engine5

목록 보기
98/102
post-thumbnail

2024.08.20

깃허브!풀리퀘!
https://github.com/ChangJin-Lee/Project-Lena https://github.com/ChangJin-Lee/Project-Lena/pull/18

이번 포스팅에서는 인벤토리 시스템에서 아이템 관리 및 무기 장착 기능을 개선한 내용을 다룹니다. 드래그 앤 드롭을 통한 무기 장착, 다양한 아이템의 마우스 클릭 입력 처리, 그리고 무기 교체 및 액션 실행을 위한 최적화 과정을 설명합니다.

진행상황

  • ✅ 아이템 관리 최적화
    • ✅ 인벤토리에서 아이템 안전하게 제거
    • ✅ TArray에서 아이템 완전 삭제 및 메모리 관리 개선
  • ✅ 무기 관리 및 장착
    • ✅ WeaponSlotComponent를 통한 아이템 관리
    • ✅ 무기 장착 및 교체 기능 완성
  • ✅ UI 및 위젯 상호작용
    • ✅ 드래그 앤 드롭 기능을 통한 무기 장착
    • ✅ 여러 아이템의 마우스 좌클릭 입력 처리
무기 관리 및 인벤토리 시스템 구조

1. 마우스 좌클릭으로 여러 아이템 사용하기

문제 정의

플레이어가 인벤토리에서 여러 종류의 아이템을 장착하고 이를 사용할 수 있도록 만들었습니다. 예를들어 총을 들고 마우스 좌클릭을 할때와 수류탄을 들고 마우스 좌클릭을 할때 각각을 관리할 수 있도록 개선했습니다.

플레이어 블루프린트에서 무기 발사 동작을 Shoot()에서 보다 범용적인 PerformAction() 함수로 변경하여 여러 아이템에 대해 다양한 액션을 처리할 수 있도록 했습니다.

해결 방법

각 아이템의 유형에 따라 PerformAction() 함수를 사용하여 아이템의 기능을 실행하도록 했습니다. 이를 통해 무기 장착, 소비 아이템 사용 등 다양한 동작을 처리할 수 있게 했습니다.

코드 구현

void ABase_Character::PerformAction()
{
    if (CurrentWeapon)
    {
        CurrentWeapon->Fire();
    }
    else if (CurrentConsumable)
    {
        CurrentConsumable->Use();
    }
    // 기타 아이템 액션 처리
}

이제 플레이어는 여러 아이템을 사용할 수 있게 되었습니다. 그리고 각 아이템이 그에 맞는 액션을 실행하도록 처리되었습니다.

2. 무기 장착 및 무기 교체 완성하기

문제 정의

무기 장착과 교체 기능을 보다 정교하게 구현하기 위해 EquipItem()ChangeItem() 함수를 완성했습니다. 이로 인해 플레이어는 게임 내에서 인벤토리와 장비 슬롯 간 무기를 자유롭게 교체할 수 있게 되었습니다.

해결 방법

EquipItem()은 무기를 장착하는 기능을, ChangeItem()은 장착된 무기를 다른 무기로 교체하는 기능을 담당합니다. 이를 통해 인벤토리와 장비 슬롯 간의 상호작용이 더욱 유연해졌습니다.

코드 구현

// 아이템 줍기
void ABase_Character::EquipItem(FInventoryItem ItemData, EInventorySlotType InventorySlot, int32 SlotIndex)
{
	ABase_Item* Item = Cast<ABase_Item>(ItemData.ItemActor);
	
	if(InventorySlot == EInventorySlotType::ISt_Inventory)
	{
		if(InventoryComponent)
		{
			InventoryComponent->RemoveItem(ItemData);
		}
		if(WeaponSlotsComponent)
		{
			WeaponSlotsComponent->Items[SlotIndex] = ItemData;
			if(!CurrentWeapon)
			{
				DrawWeapon(SlotIndex);
			}
		}
	}
	else if (InventorySlot == EInventorySlotType::ISt_Ground)
	{
		if(GroundItemsComponent)
		{
			GroundItemsComponent->RemoveItem(ItemData);
		}
		
		if(WeaponSlotsComponent)
		{
			WeaponSlotsComponent->Items[SlotIndex] = ItemData;
			if(!CurrentWeapon)
			{
				DrawWeapon(SlotIndex);
			}
		}
		
		if(Item)
		{
			Item->Destroy();
		}
	}
	
	UGameplayStatics::PlaySoundAtLocation(GetWorld(), PickupItemSound, GetActorLocation());
}
void ABase_Character::ChangeItem(int32 SlotIndex)
{
    if (WeaponSlotsComponent && WeaponSlotsComponent->Items.IsValidIndex(SlotIndex))
    {
        // 현재 장착된 무기 제거
        if (CurrentWeapon)
        {
            CurrentWeapon->DetachFromActor(FDetachmentTransformRules::KeepWorldTransform);
            CurrentWeapon->Destroy();
        }

        // 새로운 무기 장착
        EquipItem(SlotIndex);
    }
}

플레이어가 무기 장착과 교체를 보다 원활하게 수행할 수 있게 되었습니다.


3. 인벤토리 및 장비 구분 처리

문제 정의

드래그 앤 드롭을 통해 아이템을 인벤토리와 장비 슬롯 간에 이동시킬 때, 각각의 슬롯이 적절하게 처리되도록 하기 위해 인벤토리 타입을 구분할 필요가 있었습니다. 이를 위해 EInventoryType 열거형을 도입하여 인벤토리와 장비를 구분했습니다.

해결 방법

EInventoryType 열거형을 활용하여 인벤토리와 장비 창 간의 아이템 이동을 처리했습니다. 이를 통해 플레이어가 아이템을 드래그하여 적절한 위치에 드롭하면, 해당 아이템이 올바르게 처리되도록 했습니다.

코드 구현

UENUM(BlueprintType)
enum class EInventoryType : uint8
{
    IT_Inventory UMETA(DisplayName = "Inventory"),
    IT_Equipment UMETA(DisplayName = "Equipment")
};

bool UInventoryComponent::RemoveItem(const FInventoryItem& ItemData, EInventoryType InventoryType)
{
    if (InventoryType == EInventoryType::IT_Inventory)
    {
        // 인벤토리에서 아이템 제거
    }
    else if (InventoryType == EInventoryType::IT_Equipment)
    {
        // 장비 창에서 아이템 제거
    }
}

드래그 앤 드롭 기능이 정상 작동하고, 슬롯 간 아이템 이동 시 인벤토리와 장비 창의 구분이 명확해졌습니다.


결론

이번 작업에서는 인벤토리 관리, 무기 장착 및 교체, 그리고 드래그 앤 드롭 기능을 개선하여 게임 플레이를 완성했습니다. 이를 통해 보다 직관적이고 편리하게 게임을 즐길 수 있게 되었습니다.


profile
Unreal Engine 클라이언트 개발자

0개의 댓글