1. 문제 상황
인벤토리 슬롯 UI선택을 토글로 구현.
같은 슬롯을 연속으로 3번 클릭할 경우 선택 기능이 비정상적으로 작동.
발생 예시
- 슬롯 A 클릭 → 선택
- 슬롯 A 클릭 → 선태 해제
- 슬롯 A 클릭 → 선택
- 슬롯 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. 개인적인 생각
이 문제를 통해 코드를 일괄처리하면서 깔끔하게 정리하는것도 중요하지만, 기능을 잘 고려하여 분할해야 될때는 분할해야 된다는걸 체감했다. 동작을 명확하게 이해하고 구조를 설계하는 개발자가 되자..
'Unity > 트러블 슈팅' 카테고리의 다른 글
| [Unity] Fade가 끊기는 문제 해결 (0) | 2025.06.18 |
|---|---|
| [Unity] Time.unscaledDeltaTime이 첫 프레임에 튀는 현상 (0) | 2025.06.17 |
| [Unity] 발사체 반사 방향이 이상하던 문제 (0) | 2025.05.21 |
| [Unity] MonoBehaviour 생성자 오류 (0) | 2025.05.20 |
| [Unity] 타일맵 크기 변경 오류 (0) | 2025.05.16 |