UI_1

CJB_ny·2022년 1월 25일
0
post-thumbnail

UI관리를 해보도록 하자.

먼저 UI들을 하나하나 OnClick에다가 드래그 드롭으로 다 옮길 수 없으니까

이것을 자동화를 해주도록 하자.


enum 버튼들을 만들고


Bind함수를 만들어서 넘겨 주어야 하는데

enum은 변수가 아니라서 인자로 넘겨줄 수 없다.

그래서 이때 사용하는 것이 reflection이라는 기능이다.

reflection는 모든 정보들에 대해 엑스레이를 찍어가지고 정보를 다 남겨 줄 수 있는 것이다.


그래서 reflection을 사용을 할때는 Type type을 받는다.


그래서 init(start)에 reflection기능을 이용을 해서 Buttons라는 애들을 넘겨주는 작업까지는 이까지하면 된것이다.

이렇게 enum값을 넘기는 것 까지는 된것이다.


그럼
Bind< Button >은 Bind를 할것인데 Button이라는 컴포넌트를 찾아가지고

reflection으로 전달받은 Buttons를 매핑을 할 것이라는 소리이다.

그래서 enum은 그냥 enum이라 문자열로 바꾼다거나 할 수 없는데(c++)에서

c#은 조금 우월 하게 Enum.GetNames(type) => type이 enum인데 이것을 문자열로 바꾸어 준다.

그리고 유니티에서 텍스트든 오브젝트든 모든 것은

UnityEngine.Object로 관리(불러올수)있다. == 최상위 부모이다.

우리가 UI_Button에서 Bind에다가 타입을 여러가지를 넣어 주었으니까


이렇게

이것의 타입을 관리를 하기위해서 UI_Base에서

이것들을 타입별로 관리를 하기 위한 _objects 딕셔너리를 만들어 주자.

이렇게 하면은 Buttons이라는 타입은 List로 들고 있게 된다.

그리고 UnityEngine.Object[] objects라는 배열의 길이는

Buttons의 길이(크기)가 5이니까 길이가 5인 리스트를 만들어 주기 위해서

objects의 길이를

     UnityEngine.Object[] objects = new UnityEngine.Object[names.Length];

이렇게 해준다.

이제는 그러면 enum Button안의 있는 것들을 하나하나 찾아가지고 매핑을 시켜주어야 한다.


모든 names들을 돌면서 찾아 보도록 하자.


현재 Ui_Button이 최상위 부모라

UI_button 스크립트 안에서 gameObject는 UI_button이다.

그래서 자식들 중에서 같은 이름이 있는지를 찾아보아야 한다.

자식들을 찾는 기능들은 여기서만 쓰는것이 아니니 유틸성 함수들을 사용하기 위한 스크립트 파일을 만든다 Utils.cs생성

여기다가 기능성 함수들을 다 넣어준다,


함수를 이렇게 파준다

reculsive는 재귀적으로 찾을 것인지를 묻는 것인데

이것은 자식의 자식을 찾을 것인지를 묻는 것이다.


그래서 else문 안에서 T component in go(인자로받은 gameObject이다,).GetcomponentInChildren< t > 를 해주고 component.name == name이랑 같다면 return 을 해준다.


그래서 breakPoint를 잡아서 실행을 해보면

UI_Button에서 정의해놓은 대로 다 잘 들어와있다.

그다음에이는 이제 Get을 사용을 해서 여기서 뭔가를 꺼내서 사용을 하면 될 것이다.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글