원래 Enum을 사용하려했지만 UI들이 지속적으로 추가가 될 것이기 때문에 일단은 Key의 값을 string으로 진행했습니다. (딕셔너리에 Enum을 사용하면 박싱이 일어난다는 이야기가 있는데 찾아본 결과 Net 4.x부터는 딕셔너리가 Enum을 비교할때 별도로 박싱이 일어나지 않는다고 한다.)
UI들은 Resources를 이용해서 동적 생성을 할 것인데
아래처럼 각자 1개씩 진행하다보니 너무 지저분하다....
이제 위의 코드를 리팩토링하면서 진행을 해보기로 하자!
Resources에 해당하는 GameObject의 Type을 모두 가져와 배열인 uis로 초기화를 해주고 딕셔너리 uiGroup에 Key값으로 오브젝트의 이름, Value값으로 오브젝트를 넣어준다.
여기서 까먹지 않아야 하는 것은 우리는 Resources에 있는 GameObject를 가져온 것이지 아직 생성을 하지 않아서 할 수 있는것이 없다는 것이다.
이제 딕셔너리에 있는 Value들을 생성하고 다시 넣어주자
처음 (key == uis[0].name)은 필자는 Canvas가 0번째 이므로 위의 사진처럼 했지만 UI의 순서는 언제든 변경이 될 수 있기 때문에 저런식으로 진행하면 안된다.
newUiGroup이라는 새로운 딕셔너리를 만드는 이유는 Foreach에서 딕셔너리의 값을 변경하게 되는 경우 컬렉션을 수정하게 되기 때문에 InvalidOperationException의 오류가 발생한다.
물론 newUiGroup[key].name = key는 오브젝트의 값을 바꾸는 것이 아니므로 컬렉션에 영향없기 때문에 가능하다.
마지막으로는 UI마다 처음에 해줘야하는 세팅을 해주면 끝이 나게 된다.
UIInit은 Interface로 처음 실행해주는 의미로서 만들었다.
이제 Resources에 있는 오브젝트들이 게임에서 생성이 되는지 확인할 차례이다.
현재 Resources폴더 안에 UI폴더에 있는 오브젝트들이다.
게임을 실행하고 확인할 결과 아래의 사진처럼 오브젝트들이 문제 없이 생성된다.
여기서 폴더에 안보이는 오브젝트들도 있는데 이유는 Mini Game이라는 폴더에 있는 오브젝트들도 생성이 됬기 때문이다.
지금은 모든 UI를 모두 생성을 하고 있다.
하지만 씬마다 필요한 UI와 불필요한 UI들이 있는데 이후에 씬마다 필요한 UI들을 로드하고 씬을 이동할때는 언로드를 시켜 관리해야겠다.