Unity/트러블 슈팅

[Unity] 인벤토리 - 슬롯 선택 동작 오류

turbulence93 2025. 5. 30. 20:30

1. 문제 상황 

인벤토리 슬롯 UI선택을 토글로 구현.

같은 슬롯을 연속으로 3번 클릭할 경우 선택 기능이 비정상적으로 작동.

 

발생 예시

  1.  슬롯 A 클릭 → 선택
  2.  슬롯 A 클릭 → 선태 해제
  3.  슬롯 A 클릭 → 선택
  4.  슬롯 B 클릭 → 슬롯 A가 선택된 채로 슬롯 B도 같이 선택된것 처럼 보임 

2. 원인 분석

구조

//Slot 클래스
slotButton.onClick.AddListener(Toggle);

public void Toggle()
{
    if (isSelect)
    {
        DeselectSlot();
    }
    else
    {
        SelectSlot();
    }

    OnSelectSlotHandler?.Invoke(this);
}

public void SelectSlot()
{
    if (slotItem?.itemData == null) return;

    isSelect = true;
    itemFrame.effectColor = selectColor;
}

public void DeselectSlot()
{
    isSelect = false;
    itemFrame.effectColor = noramlColor;
}
  • Button 컴포넌트를 통해 Toggle() 매서드를 등록하여 슬롯 선택 시 선택/해제를 처리.
  • OnSelectSlotHandler?.Invoke(this)를 통해 슬롯이 선택되면 업데이트를 실행.
 public void OnSelectSlot(InvenSlot selectSlot)
 {
     if (this.selectSlot == selectSlot)
     {
         this.selectSlot = null;
         inventory.DeselectItem();
         return;
     }

     this.selectSlot?.DeselectSlot();
     this.selectSlot = selectSlot;
     inventory.SelectItem(selectSlot);
 }
  • 같은 버튼 선택시 Deselect를 호출하지만 Deslect에는 업데이트를 호출하지 않아서 정보의 오차가 생김

3. 문제 해결

UI 업데이트 위치를 명확히 분리

  • SelectSlot() / DeselectSlot() 안에 업데이트 처리를 명확히 위치시켜,
    외부에서 OnSelectSlot() 호출 시에도 UI가 정상적으로 갱신되도록 변경
 public void SelectSlot()
 {
     if (slotItem?.itemData == null) return;

     isSelect = true;
     itemFrame.effectColor = selectColor;
     OnSelectSlotHandler?.Invoke(this);
 }

 public void DeselectSlot()
 {
     isSelect = false;
     itemFrame.effectColor = noramlColor;
     OnSelectSlotHandler?.Invoke(this);
 }
 
  • InvenUI.OnSelectSlot()에서 직접 DeselectSlot()을 호출하더라도 업데이트 상태가 정상적으로 반영됌

4. 개인적인 생각

이 문제를 통해 코드를 일괄처리하면서 깔끔하게 정리하는것도 중요하지만, 기능을 잘 고려하여 분할해야 될때는 분할해야 된다는걸 체감했다. 동작을 명확하게 이해하고 구조를 설계하는 개발자가 되자..