들어가며
가끔 코드를 무엇이 반환되는지 까먹을 때가 있다. 나만 그런건가...?
내가 쓴 함수나 변수라면 조금만 생각하면 되거나, 그나마 내가 닿을 수 있는 스크립트에 있는 반면에 Unity가 만들어둔 것들은 그러기가 매우 껄끄럽다는 점이 있다.
그중에는 childCount와 GetComponentsInChildren이 있다.
"컴포넌트를 가져오는 것"과 "자식의 수를 반환하는 것"이 무엇이 헷갈린다는 거지?라고 생각이 든다면, 그렇게 생각하는 것이 당연하다.
하지만, 짚고 넘어가야 하는 중요한 포인트가 존재한다. 이 글에서는 해당 포인트를 짚고 넘어가겠다.
테스트

테스트를 위해서 오브젝트들의 세팅을 다음과 같이 마쳐둔 상태이다.
childCount
밑의 스크립트를 Parent라는 빈 오브젝트에 붙여주고, 실행시켰다.
(Parent는 Child_1, 2, 3, 4를 가지고 있다.)
using UnityEngine;
public class Parent : MonoBehaviour
{
private void Start()
{
for (int i = 0; i < gameObject.transform.childCount; i++)
{
var children = gameObject.transform.GetChild(i);
Debug.Log($"no.{i} ///" + children.name);
}
Debug.Log($"ChildCount is {gameObject.transform.childCount}");
}
}
이 스크립트는 나의 자식의 수만큼 반복문을 실행시키는 스크립트이다.
반복문 안에는 현재 인덱스(i)와 GetChild를 이용해 자식의 이름을 출력하는 코드
마지막에는 자신의 자식의 수를 로그로 알려준다.

결과를 표로 정리한 것이다.
| 인덱스(코드상 i) | 오브젝트 이름(children.name) |
| 0 | Child_1 |
| 1 | Child_2 |
| 2 | Child_3 |
| 3 | Child_4 |
실제로 0번째 인덱스에는 Child_1이 ~ 3번째 인덱스에는 Child_4가 로그에 찍히고, childCount는 4라는 int로 반환되었다.
여기까지는 당연한 것처럼 느껴진다. 그렇다면, 다음 테스트를 보자.
GetComponentsInChildren<T>
private void Start()
{
GetComponentsInChildrenTest();
}
void GetComponentsInChildrenTest()
{
Transform[] childrens = gameObject.GetComponentsInChildren<Transform>();
for (int i = 0;i < childrens.Length; i++)
{
Transform child = childrens[i];
Debug.Log ($"no.{i}, name. {child.name}");
}
Debug.Log($"Childrens length is {childrens.Length}");
}
이 코드는 자식 오브젝트들의 Transform을 배열에 담아 온다. 그리고 그 배열의 길이만큼 반복문을 실행한다.
반복문은 현재 인덱스(i)와 해당 자식 오브젝트의 이름을 출력한다.
마지막에는 배열의 길이를 출력한다.

위의 스크린샷이 스크립트를 실행시킨 결과이다. 이것으로 미루어보아 하이어라키 기준 위에서부터 아래로 순회하는 것을 확인할 수 있다.
게다가, 자기 자신도 포함해서 Transform을 담았으며, 자식의 자식 오브젝트 또한 포함하여 실행한 것을 확인할 수 있었다.
정리하며
childCount 는 자기 자신을 제외한 자신의 자식들의 수를 반환한다.
GetChild( i ) 는 테스트에서 잠깐 나왔지만, 첫번째 자식의 인덱스는 0부터 시작하고(Child_1의 인덱스는 0)
GetComponentsInChildren() 는 자기 자신 그리고 자식의 자식도 모두 포함하여 컴포넌트를 가져온다.
컴포넌트를 가져올 때는 자기 자신도 포함해서 검색을 한다는 것이다. 그런데 가끔 자식이라는 키워드로 기억을 하다 보니, childCount를 사용할 때 자기 자신도 포함해서 세는지 헷갈릴 때가 있다는 것이다.
이제 이 글을 읽으면서 확실하게 알았을 테니 다음부터 헷갈리지 말자!
'Unity > Unity 라이브러리' 카테고리의 다른 글
| UI의 위치 값은 두가지? (0) | 2025.10.12 |
|---|---|
| Sprite가 늘어나는 영역을 정해준다, Sprite Border (0) | 2025.10.06 |
| FindObjectOfType<T>와 FindObejctsByType<T> (0) | 2025.10.02 |
| 버튼에 함수 연결하기 (0) | 2025.09.24 |
| URP에서의 카메라 오버레이 (0) | 2025.09.18 |