-
2024.2.26 - UIManagerTIL 2024. 2. 26. 22:04
개인 프로젝트 막바지에 Json에 대해서 여쭤보다가 나온 내용이긴합니다만..
시간이 부족해서 제대로 다뤄보지 못했는데 이제서야 다뤄보는 UIManager입니다.
UIManager라는 이름을 가진 cs들을 많이 만들었었는데요.
Manager라고 하면은 싱글턴을 가지면서 Json처럼 UIManager를 AddComponent를 하지 않아도 사용이 가능해야합니다.
그렇기 때문에 public을 이용해서 GameObject와의 연결이 있어서는 안됩니다.
1. UIBase script
UI script를 만들 때 부모 역할을 하는 script입니다.
UI 생성 시 공통되는 부분을 가지고 있으며, 현재 없더라도 생성해주는 것이 좋습니다.
2. 제네릭을 통한 생성
UIBase script를 생성하는 이유는 여기에 있습니다.
제네릭을 이용하기 위해서는 제네릭을 사용하는 범위를 지정해줘야합니다.
public T OpenPopupUI<T>() where T : PopupUIBase { return OpenPopupUI(typeof(T).Name) as T; }
UIBase script 이름을 PopupUIBase라고 해줬으며, PopupUIBase를 상속받지 않는 Object들은 OpenPopupUI 함수를 사용할 수 없습니다.
typeof(T).Name : T의 이름을 가져옵니다. 즉, T가 GameManager라면 "GameManager" string을 가집니다.
이는 클래스명과 Resources에 있는 이름을 같게 만들면 가져오기 편하기 때문에 만들어주었습니다.
3. Component의 접근성
T를 반환하기 때문에 class script를 반환해줍니다.
이는 GetComponent를 하지 않아도 사용이 가능하므로 접근성을 편하게 해줍니다.
4. Object 생성
GameObject obj = OpenPopupUI<PopupUIBase>().gameObject; Instantiate(obj);
.gameObject를 이용해서 Type을 gameObject로 만들고 이를 GameObject에 저장하여 Instantiate를 해주면 생성됩니다.
다른 씬에서 cs 적용에 대해서 여쭤보려고 갔다가 싱글턴에 대해서 더 많은걸 알게 되었습니다.
그래서 TIL에 머 적어야했지가 기억이 잘 안나서 덜 적은게 있을 수 있습니다....
싱글턴 추가 내용
MonoBehaivour를 사용한다는 것은 unity에서 사용한다는 것이기 때문에 GameObject를 생성한 뒤에 AddComponent를 해줍니다.
MonoBehaviour이 없을 경우 Unity에서 사용하지 않는다는 뜻이므로 new를 이용해줍니다.
new를 사용한다는 것은 메모리에 저장되기 때문에 unity에서 제대로 사용할 수 없습니다.
AddComponent나 new는 둘 다 새로 생성하는 것이기 때문에 동적 생성을 해줘야합니다.
동적 생성은 Resources.Load를 이용해서 script 내에 있는 Object들을 연결시켜주는 것을 말합니다.
Hierarchy 에 있을 경우 연결을 해준 상태일 것이기 때문에 GetComponent를 이용해서 가져와야합니다.
GameObject를 받고 거기에 있는 GetComponent를 가져오는 것을 함축해서 this로 표현합니다.
만약 this를 이용하게 되면 Awake에 작성하게 되는데 이때 Awake의 순서가 랜덤으로 정해져있기 때문에 GameManager.instance가 null일 수 있습니다.
Awake의 경우 순서를 정해줄 수는 있습니다만 양이 많으면 정리하기 힘들기 때문에 비추하는 방법입니다.
Execution Order를 눌러줍니다.
+를 눌러서 원하는 script를 눌러줍니다.
오른쪽의 숫자가 작을 수록 먼저 실행됩니다.
아니면 드래그로 위로 올려주면 됩니다.
Default Time는 적혀져 있지 않는 script가 있는 부분입니다.
랜덤으로 되어있습니다.