Transform을 이용한 GameObject의 자식들 접근 및 관리

2020. 8. 3. 13:21C#/토막지식

1. GameObject에 대한 정보는 Transform에서 관리하고 있다

따라서 특정 GameObject의 자식들에 대한 정보는 GameObject 관련 메소드로 접근하는 것이 아니라, Transform 관련 함수로 접근해야 해당 자식에 대한 정보를 얻거나 혹은 수정하는 일이 가능하다.

 

2. 배열이 아닌 단일 Transform을 Foreach 했을 경우, 자식 GameObject의 Transform을 모두 가져올 수 있다

위와 같은 경우 main(GameObject)의 자식은 각각 다음과 같다.

- Image

- Text

- btnRefresh

- UIListMembers

 

여기서 main의 GameObject에 Transform을 Getcomponent 하거나, 혹은 GameObject째로 Asign시킨 Transform 클래스 멤버 객체를 가져와서 foreach로 돌리게 된다면, 해당 요소들은 전부 main의 자식 Transform이 나오게 된다. 예를 들어 다음과 같은 코드를 작성했다고 했을 때.

public class UIMembers : MonoBehaviour
{
	public Transform main;
    public void GetChildTrans()
    {
        foreach(Transform child in this.main)
        {
            Debug.LogFormat($"main Tr : {child.name}");
            Debug.LogFormat($"main Tr Count : {main.childCount}");
        }
    }
}

여기서 나오는 Log값은 main의 자식 오브젝트들의 Transform인 Image, Text, btnRefresh, UIListMembers의 Transform들이 전부 찍히게 되는 것이다.

 

※ 추가

- 위 개념은 인덱서(Indexer)라는 내용과 연결된다.

인덱스를 이용해 객체 내의 데이터에 접근하게 해주는 프로퍼티와 비슷한 개념이라고 생각하면 되는데

Transform 내부에선 자식 객체들이 순서대로 배열의 형태로 저장되어있기 때문에 이 개념이 적용된다.

3. 위 방법은 GameObject를 Foreach하는 방법으로는 적용이 되지 않는다

foreach(GameObject child in this.main)
{
	Debug.Log(child);
}

예를 들어 위와 같은 방식으로, GameObject로써 foreach를 통해 접근했을 때엔 다음과 같은 컴파일 에러가 발생한다.

아마 GameObject쪽으론 인터페이스가 구축이 되어있지 않다고 보면 될 것 같다.

'C# > 토막지식' 카테고리의 다른 글

Serialization / Deserialization  (0) 2020.08.03