![유니티 UI Binding 오류](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbHsdU%2FbtsHFRfVDPB%2FGLeCkpzfsKavq4kVZKvXr1%2Fimg.png)
유니티 UI Binding 오류Unity/Trouble Shooting2024. 1. 3. 20:35
Table of Contents
관련 링크
피드백에 따른 UI Manager 리팩토링
Unity 개발 주제의 다양한 내용의 개인성장 개발 블로그
jhoon8903.github.io
해당 블로그에 UI 바인딩 코드를 참고하는 도중 오류가 발생하였다.
문제 코드
public void Binding<T>(GameObject parent) where T : UnityEngine.Object
{
T[] objects = parent.GetComponentsInChildren<T>(true);
// 오류 부분
Dictionary<string, Object> objectDict = objects.ToDictionary(comp => comp.name, comp => comp as Object);
_objects[typeof(T)] = objectDict;
AssignComponentsDirectChild<T>(parent);
}
Error : ArgumentException: An item with the same key has already been added.
해당 오류로 기존 Button과 Slider 부분은 오류가 발생하지 않았지만, TextMeshProUGUI, Transform을 가져올 때 키 중복 오류가 발생하였다.
아마 텍스트와 트랜스폼 부분은 가져오지 말아야할 다른 오브젝트에 있는 해당 컴포넌트도 인식을 해서 딕셔너리에 등록이 돼버려서 중복키로 읽어오는 거 같았다.
문제 해결
public void Binding<T>(GameObject parent) where T : UnityEngine.Object
{
T[] objects = parent.GetComponentsInChildren<T>(true);
// 중복된 이름을 가진 컴포넌트들을 하나의 키로 묶기
// 각 그룹에서 첫 번째로 등장하는 컴포넌트를 선택하여 딕셔너리에 저장
Dictionary<string, UnityEngine.Object> objectDict = objects
.GroupBy(comp => comp.name)
.ToDictionary(group => group.Key, group => group.First() as UnityEngine.Object);
_objects[typeof(T)] = objectDict;
AssignComponentsDirectChild<T>(parent);
}
딕셔너리에 새로운 값을 추가하기 전에 해당 키가 이미 존재하는지 확인해서 이미 존재한다면 더 이상 추가하지 않도록 처리하였다.
해결방법은 GroupBy를 사용하여 중복된 키를 그룹화하고 각 그룹에 대해 처음 등장하는 항목을 선택하도록 고쳤다.
'Unity > Trouble Shooting' 카테고리의 다른 글
유니티 UI 화면 비율 문제 (0) | 2024.01.31 |
---|---|
유니티 APK 빌드시 Text 파일 경로 문제 (0) | 2024.01.29 |
유니티 FirebaseDatabase 인스턴스 초기화 오류 (0) | 2024.01.13 |
유니티 AudioSource 최대 중첩 오류 (0) | 2024.01.08 |