어제 특강에서 유니티에서 Find 함수를 쓰면 편하지만 하이라이키를 다 뒤져서 찾아다니기 때문에 많을 때는 찾기 힘들어져서 메모리상 좋지 않고, 언제든지 변경될 수 있는 부분이라 사용하지 않는게 좋다는 것을 배웠다
그 부분에 대해 튜터님에게 대체할 방법이 무엇이 있을까요? 라는 질문을 했었다
답변 : 한 캔버스 당 스크립트를 만들어 UI 구조를 분리하고 그 분리한 내용을 싱글턴화를 한 UIManager에서 Dictionary에 저장해서 접근 하는 방법이 좋다 또한 [Serialrizefield] private으로 설정하여 인스펙터에 할당해줘도 괜찮다
*추가로 유니티에서 처음 작업할 때 내용을 분리하지 않고 한 스크립트에 몰아서 작성하는데 (바로 나) 이것은 좋지 않은 방법이고 UI는 UI를 관리만 하고 로직은 Manager에서 작성하여 메서드로 넘겨주는 구조가 좋다
그래서 StartSceneController에 전부 들어가 있던 코드들을 UI는 UIStartHandler로 분리하여 UI를 관리만 하게 변경해주고 로직 들은 StartSceneController를 StartSceneManager로 변경하고, 싱글턴화 하여 관리하였다
UIManager에서는 Dictionary<string, MonoBehavor> 에 저장해주는 Add함수와 Dictionary에 접근하여 사용할 수 있는 get함수를 만들어 반환을 할 수 있게 하였다
(Remove는 필요없을 줄 알았다)
그 후 UIStartHandler를 어디에서 추가를 하면 좋을지에 대해 고민해보았는데 MonoBehavor는 new 연산자를 사용할 수 없어서 델리게이트 이벤트를 사용해보기도 하였는데 계속 null 값이 나오면서 갈피를 못잡았었다
결국 UIStartHandler 의 Awake()에서 추가를 해주고 사용할 클래스에서 Awake에서 할당을 해주었다
하지만 이렇게 하면 다른 씬을 이동했다가 다시 오면 UIStartHandler에서 UIManager로 저장되기도 전에 할당이 되어서 null값이 나오게 되었다
이 부분은 추가를 먼저할 수 있게 할당은 Start()에서 추가는 Awake()에서 하는 것으로 해결하였다
성공적으로 구현을 마치고 튜터님한테 피드백을 받았을 땐 구조가 생각하신것 처럼 딱 나왔다고 칭찬을 받았다 ! 밤 새면서 구조 생각했던게 뿌듯했다
그리고 추가로 더 심화된 방법도 있었는데 그 부분은 시간이 날 때 직접 구현해보고 다시 설명하려 한다
일단 대충 정리해두자면
함수를 <T> 제네릭으로 설정하여 typeof(Name)을 받아오면 함수 이름을 직접 설정해 줄 필요 없게 되는 방법
+ UI 캔버스 마다 프리팹으로 설정하고 Resource.Load를 사용하여 Get함수에 접근하고 생성 해서 Dictionary에 저장을 하는 방법이 있다
일단 이 부분은 팀과제 끝나고 구현해볼 생각이다
'TIL' 카테고리의 다른 글
[TIL] 내일배움캠프_Unity 팀과제 회고 (0) | 2023.09.14 |
---|---|
[TIL] 내일배움캠프_Unity 팀과제(feat.코루틴) (0) | 2023.09.13 |
[TIL] 내일배움캠프_Unity 깃허브 특강 (1) | 2023.09.11 |
[TIL] 내일배움캠프_Unity 알고리즘 (0) | 2023.09.10 |
[TIL] 내일배움캠프_Unity 팀과제 Button할당 (0) | 2023.09.09 |