컨베이어 벨트 상호작용 위젯 추가

컨베이어 벨트도 플레이어가 상호작용할 수 있도록 수정했다.

벨트가 설비와 연결되어 있어도, 사용자가 벨트가 어느 설비 슬롯과 연결되어 있는지 직접 확인하거나 변경하기 어려웠다. 그래서 벨트에 상호작용하면 연결 설정 위젯이 열리도록 했다.

컨베이어 벨트 상호작용
→ 연결 대상 확인
→ 사용할 output 슬롯 선택
→ 선택된 슬롯 기준으로 아이템 이동

슬롯 미할당 상태 표시

벨트가 설비와 연결되어 있어도 아직 입출력 슬롯이 할당되지 않은 경우가 있다.

이 상태에서는 플레이어 입장에서 벨트가 왜 제대로 동작하지 않는지 알기 어렵다. 그래서 벨트에 연결 슬롯이 지정되지 않은 경우, 월드 상에 느낌표 표시가 뜨도록 했다.

벨트가 설비와 연결됨
→ 하지만 output 슬롯이 지정되지 않음
→ 느낌표 표시

슬롯이 정상적으로 지정됨
→ 느낌표 숨김

인벤토리와 설비 슬롯 간 우클릭 이동

기존에는 인벤토리에서 설비 input 슬롯이나 보일러 fuel 슬롯으로 아이템을 넣을 때 주로 드래그 앤 드롭을 사용했다. 기능은 동작했지만, 제작 과정에서 재료를 반복적으로 넣고 빼야 하는 상황에서는 조작이 번거로웠다.

그래서 우클릭으로 처리할 수 있도록 개선했다.

인벤토리 → 설비 input 슬롯
설비 input 슬롯 → 인벤토리
설비 output 슬롯 → 인벤토리
인벤토리 → 보일러 fuel 슬롯
보일러 fuel 슬롯 → 인벤토리

이동 방향은 크게 두 가지로 나누었다.

1. 슬롯 → 인벤토리
2. 인벤토리 → 슬롯

슬롯에서 인벤토리로 빼는 경우에는 클릭 대상이 KOFactorySlotWidget이기 때문에 슬롯 위젯 안에서 처리했다.

반대로 인벤토리에서 슬롯으로 넣는 경우에는 클릭 대상이 인벤토리 슬롯이므로, 부모 위젯이 인벤토리 우클릭 이벤트를 받아 해당 설비 슬롯으로 전달하는 구조로 구현하였다.


FactorySlotWidget 공통화

설비 input 슬롯, output 슬롯, 보일러 fuel 슬롯은 모두 KOFactorySlotWidget을 사용한다.

슬롯에서 인벤토리로 이동하는 처리는 MoveCurrentSlotItemToInventory() 하나로 통합했다.
실제 추출 방식만 Mode에 따라 다르게 처리하도록 분리했다.

switch (Mode)
{
case EKOFactorySlotMode::Fuel:
    // 보일러 연료 버퍼에서 추출
    break;

case EKOFactorySlotMode::ProcessorInput:
    // 설비 input 버퍼에서 추출
    break;

case EKOFactorySlotMode::ProcessorOutput:
    // 설비 output 버퍼에서 추출
    break;
}

인벤토리에서 슬롯으로 넣기

설비 input 슬롯에 넣을 때는 TryInsertItem()을 사용하고, 보일러 fuel 슬롯에 넣을 때는 TryInsertFuel()을 사용한다. 하지만 전체 흐름은 동일했다.

인벤토리에서 아이템 제거
→ 현재 슬롯에 넣기 시도
→ 못 들어간 수량은 인벤토리에 복구
→ 슬롯 UI 갱신

KOFactorySlotWidget에 TryMoveInventorySlotToThis()를 추가했다.

해당 함수는 현재 슬롯의 Mode에 따라 다음처럼 동작한다.

if (Mode == EKOFactorySlotMode::Fuel)
{
    // 보일러 fuel 슬롯에 연료 투입
}
else if (Mode == EKOFactorySlotMode::ProcessorInput)
{
    // 설비 input 슬롯에 재료 투입
}
else
{
    // output 슬롯은 아이템을 받을 수 없음
}

각 클래스의 역할 정리

KOFactorySlotWidget
→ 실제 아이템 이동 처리

KOFactoryProcessorWidget
→ 인벤토리 우클릭 이벤트를 input 슬롯에 전달

KOFactoryProducerWidget
→ 인벤토리 우클릭 이벤트를 fuel 슬롯에 전달

정리

기존에는 드래그 앤 드롭 중심이었던 아이템 이동을 우클릭으로도 처리할 수 있게 개선했고, fuel/input/output 슬롯의 이동 로직을 KOFactorySlotWidget 중심으로 공통화했다.

슬롯 자체에서 처리할 수 있는 기능은 KOFactorySlotWidget에 두고, 부모 위젯은 인벤토리 우클릭 이벤트를 받아 적절한 슬롯으로 전달하도록 분리했다.