본문 바로가기
스파르타 내배캠

스파르타 내배캠 Unity 3기 34일차

by LemongO 2024. 2. 8.

연휴라고?!?!

 

 

아 본가가면 그 동안 프로젝트 못하는데...

아...

아...

ㅏ...

 

 


UI 자동화 2 - 원하는 이름의 T 타입을 가진 자식 찾기

 

저번에 자동화 TIL 에서 Bind 와 Get 함수로
UI 오브젝트의 자식들을 검사해 원하는 UI 컴포넌트들을 사용하는 방법을 썼다.

 

그런데 Bind 에서 자식을 검색할 때 어떤 방식으로 검색을 할까?

그걸 알아보자.

 

 

다음은 names[i] 라는 이름의 T 컴포넌트를 가진 자식오브젝트를 찾기위해 쓰인 코드이다.

objects[i] = Util.FindChild<T>(gameObject, names[i], true);

 

 

Util 클래스는 범용적으로 쓰일 유틸리티 클래스이므로 static으로 만들었다.

그리고 다음은 실제 자식을 찾는 FindChild 함수이다.

public static T FindChild<T>(GameObject go, string name = null, bool recursive = false) where T : UnityEngine.Object
{
    if(go == null)
        return null;

    if (recursive == false)
    {
        for (int i = 0; i < go.transform.childCount; i++)
        {
            Transform transform = go.transform.GetChild(i);
            if (string.IsNullOrEmpty(name) || transform.name == name)
            {
                T component = transform.GetComponent<T>();
                if(component != null)
                    return component;
            }                    
        }
    }
    else
    {
        foreach(T component in go.GetComponentsInChildren<T>())
        {
            if (string.IsNullOrEmpty(name) || component.name == name)
                return component;
        }
    }

    return null;
}

 

매개변수로 GameObject, string, bool 값을 넘겨주고 원하는 타입 <T> 를 넘겨주면 T로 반환해준다.
다음은 매개변수의 역할이다.

  • GameObject는 찾고자하는 자식의 부모 오브젝트이다. 대체로 자기 자신을 넣어준다.
  • string은 찾고자하는 자식의 오브젝트 이름이다.
  • bool 은 자식의 자식까지 찾을 것인지에 대한 분기점이다. false일 땐 go 의 직속 자식만 검사한다.

 

Button을 바인드 한다고 했을 때, Bind<T>로 들어오는 값은 Button, FindChild<T> 로 들어오는 값도 Button

그리고 Bind 함수에서 Enum 의 Type을 받아 FindChild 함수에 name을 넘겨줬기 때문에
name 이라는 이름의 Button을 가진 자식을 가져올 수 있다.


물론 Button 컴포넌트가 해당 자식에게 없다면 null 값을 반환한다.

 

 

자 그럼 여기까지 원하는 T 타입의 컴포넌트를 가진 자식 오브젝트를 Bind 했고,
Get 하여 해당 컴포넌트를 불러오는 방법은 알아냈다. 

그렇다면 이 UI Object를 씬에 불러오는 방법은?

 

그것은 UIManager 가 담당하게 된다.

 

그것은 내일!

이번 자동화는 연휴지만 토요일을 제외하고 매일매일 써보고자 한다.