카테고리 없음
버튼 클릭 두번되는 현상 발생 - 버그수정
이더23
2024. 12. 31. 19:36
분해할 아이템을 저장한 다음에 해당 아이템 테이블에서 분해할 아이템 지정해 놓은거를 반환해서 가져온뒤 딕셔너리를 통해서 값을 저장하는데 이때 중복된 키를 가지고 있으면 값을 늘리는 방식으로 코드를 작성했다.
public void OnDisassembly() //아이템 분해 버튼 클릭시 분해 아이템 획득
{
Dictionary<int, int> rewards = new Dictionary<int, int>();
int count = 0;
for (int i = 0; i < _items.Count; i++)
{
if (rewards.TryGetValue(DataManager.Instance.Item.GetItemData(_items[i].itemId).disassemblyItemId, out count))
{
count++;
rewards[DataManager.Instance.Item.GetItemData(_items[i].itemId).disassemblyItemId] = count;
}
else
{
rewards.Add(DataManager.Instance.Item.GetItemData(_items[i].itemId).disassemblyItemId, 1);
}
ItemManager.Instance.DeleteItem(_items[i].id, DataManager.Instance.Item.GetItemData(_items[i].itemId).itemType);
}
panel.SetActive(true);
foreach (KeyValuePair<int, int> reward in rewards)
{
GameObject goItem = Instantiate(objCell, rewardsPanel);
ItemInstance itemInstance = ItemManager.Instance.AddItem(reward.Key, reward.Value);
goItem.GetComponent<ItemCell>().Initialize(itemInstance, 1);
ItemManager.Instance.DeleteDuplicates(itemInstance.id, itemInstance.itemId);
}
rewards.Clear();
}
문제
위와 같이 코드를 작성했을때 딕셔너리에 키값이 같으면 같은키에 값이 저장이 되어서 딕셔너리에는 중복된 키값이 없이 다 다른 키값을 보유하게 만들었는데 Instantiate를 할때 동일한 키값이 화면에 보여지는 현상이 발생해서 딕셔너리에 값이 제대로 저장이 안됐나 싶어서 찾아보니 딕셔너리에는 해당 키에 맞게 값이 잘 저장이 되는것을 확인했다 그래서 뭐가 문제인지 찾아보니
해당 값이 두번 실행이 되는것을 확인할 수 있다. 이뜻은 위 함수가 한번 실행이 되는것이 아닌 2번이 실행된다는 뜻인데 해당 함수를 실행하는 곳이 버튼이다.
private void ButtonInitialize() //버튼 함수 연결
{
disassemblyButton.onClick.AddListener(() => OnDisassembly());
panelButton.onClick.AddListener(() =>
{
Hide();
UIManager.Instance.Show<EquipmentDisassembly>().Initialize(); //해당 함수 대신에 리프레쉬 넣기
});
}
위와같이 AddListener를 통해서 해당 함수를 버튼에 연결을 하는데 두번이 클릭 된다니 말이 안된다.
그래서 AddListener를 통해서 버튼과 함수를 연결하는게 아닌 버튼에 직접 함수를 연결해서 사용한 결과 결과가 내가 생각했던대로 잘 나왔다. 그뜻은 버튼 연결이 한번이 아닌 두번이 됐다는 뜻인데 왜 그렇게 됐는지 이유를 찾아보자.
해결
콘솔에 itemCell을 클릭할때마다 숫자가 높아지는 것을 보고 구조를 봐보니 itemCell을 클릭할때마다 밑에 함수를 매번 초기화 시켜줬는데 이게 문제였던거 같다. 그래서 해당 함수를 다른곳에서 호출하게 하고 실행하니 깔끔하게 잘 나온다.
private void ButtonInitialize() //버튼 함수 연결
{
disassemblyButton.onClick.AddListener(() => OnDisassembly());
panelButton.onClick.AddListener(() =>
{
Hide();
UIManager.Instance.Show<EquipmentDisassembly>().Initialize(); //해당 함수 대신에 리프레쉬 넣기
});
}