기존 문제점

기존 BuildIOSlots()는 설비가 처리할 수 있는 모든 레시피를 순회하면서 Input/Output 아이템을 수집했다.

TArray<FName> AllRecipes;
LoadSub->GetAllRecipeIds(AllRecipes);

그리고 설비 태그와 맞는 모든 레시피의 입력/출력 아이템을 슬롯으로 생성했다.

이 방식은 모든 레시피의 아이템 슬롯이 한 번에 표시되며, 현재 선택한 레시피와 상관 없는 슬롯이 보인다.


선택된 레시피 기준으로 슬롯 생성

현재 Processor에 저장된 SelectedRecipeId를 기준으로 레시피 데이터를 찾는다.

const FName SelectedRecipeId = Proc->GetSelectedRecipe();
const FKORecipeRow* Recipe = LoadSub->FindRecipeRow(SelectedRecipeId);

선택된 레시피를 찾은 뒤, 해당 레시피의 입력과 출력 데이터만 순회해서 슬롯을 생성한다.

for (const TPair<FGameplayTag, int32>& In : Recipe->Inputs)
{
    const FName ItemId = LoadSub->FindItemIdByTag(In.Key);
    // Input 슬롯 생성
}
for (const TPair<FGameplayTag, int32>& Out : Recipe->Outputs)
{
    const FName ItemId = LoadSub->FindItemIdByTag(Out.Key);
    // Output 슬롯 생성
}

레시피를 변경할 때 기존 슬롯이 누적되지 않도록, 새 슬롯을 만들기 전에 기존 패널과 슬롯 배열을 정리했다.

InputSlotsPanel->ClearChildren();
InputSlotWidgets.Reset();

OutputSlotsPanel->ClearChildren();
OutputSlotWidgets.Reset();

정리

기존 흐름

설비가 사용할 수 있는 모든 레시피 확인
→ 모든 Input 아이템 수집
→ 모든 Output 아이템 수집
→ 슬롯 생성

 

수정 후 흐름

레시피 선택
→ 선택된 RecipeId 저장
→ 기존 Input/Output 슬롯 제거
→ 선택된 레시피의 Inputs만 기준으로 Input 슬롯 생성
→ 선택된 레시피의 Outputs만 기준으로 Output 슬롯 생성

 

슬롯 UI는 선택된 레시피에 따라 동적으로 생성된다. 하지만 실제 아이템 수량은 Processor의 Buffer에서 공유된다.