빈 퀵슬롯 선택 가능

기존에는 퀵슬롯에 FactoryId가 없거나, 해당 설비 수량이 없으면 선택 자체가 되지 않았다.

빈 슬롯이거나 아이템 수량이 부족한 경우에도 선택은 가능하게 처리했다.
대신 고스트 프리뷰나 파괴 타겟 프리뷰는 제거한다.

if (FactoryId.IsNone() || !InventoryComponent || !InventoryComponent->HasEnoughItems(FactoryId, 1))
{
    if (GridBuildComponent->IsBuildMode())
    {
        GridBuildComponent->CancelBuildMode();
    }
    else if (GridBuildComponent->IsDestroyMode())
    {
        GridBuildComponent->CancelDestroyMode();
    }

    SetSelectedBuildQuickSlot(SlotIndex);
    return;
}

빈 슬롯을 눌러도 UI 선택 상태는 반응한다.

설치할 설비가 없을 때는 고스트 프리뷰가 남지 않는다.


퀵슬롯 중복 등록 처리

같은 FactoryId가 이미 다른 슬롯에 있으면 기존 슬롯을 비우고, 새 슬롯으로 이동시킨다.

for (int32 Index = 0; Index < BuildQuickSlots.Num(); ++Index)
{
    if (Index == SlotIndex)
    {
        continue;
    }

    if (BuildQuickSlots[Index] != FactoryId)
    {
        continue;
    }

    BuildQuickSlots[Index] = NAME_None;
    BroadcastSlot(Index);
}

슬롯이 바뀌면 Data_Message_Build_QuickSlotChanged 메시지를 브로드캐스트해서 해당 슬롯 UI만 갱신한다.


Back Handle 처리

퀵슬롯과 인벤토리를 CommonUI 방식에 맞춰 처리했다.

InputMode = EKOUIInputMode::All;
// EKOUIInputMode::Game - UI에 마우스(커서)나 키보드 입력이 가지 않는 HUD나 인터페이스
// EKOUIInputMode::Menu - 캐릭터의 마우스 키보드 입력이 제한되어 오로지 UI만 조작 
// EKOUIInputMode::All - 마우스 커서는 보이나 캐릭터의 움직임은 가능 (WASD, 드래그)
// EKOUIInputMode::AllNoCursor - 마우스 커서 안보임. 캐릭터의 움직임은 가능

// BackHandler가 True면 CommonUI Input에 의해 ESC가 기본 백 키로 인식되어
// ESC를 누르면 해당 위젯이 닫히게 된다.
bIsBackHandler = true;

정리

인벤토리, 퀵슬롯이 각각 독립적으로 동작하면서 UI 제어 흐름이 분리되어 있는 문제가 있어서

인벤토리 WBP 내부에 퀵슬롯 UI를 추가 배치하여, 인벤토리와 퀵슬롯을 하나의 화면 흐름 안에서 제어할 수 있도록 수정했다.