유니티에서는 오브젝트를 Inspector 창에서 일일이 등록해서 배열이나 리스트로 관리하는 경우가 많습니다. 하지만 이 방식은 관리도 번거롭고, 오브젝트가 많아지면 실수하기도 쉽습니다.
좀 더 유연하고 효율적인 방법은 빈 오브젝트를 부모로 만들고, 자식 오브젝트들을 계층 구조로 정리한 뒤 스크립트에서 자동으로 접근하는 방식입니다.
Transform을 기준으로 순환
그런데 이때 중요한 점이 하나 있습니다. 자식을 순환하려면 GameObject 가 아닌 Transform 을 기준으로 순환해야 한다는 점입니다.
왜냐하면, 유니티의 구조상 부모-자식 관계는 GameObject 가 아닌 Transform 이 관리하고 있기 때문입니다.
* GameObject 클래스는 오브젝트의 이름, 태그, 컴포넌트 등 일반적인 정보를 관리합니다.
* 반면 Transform 클래스는 위치, 회전, 크기뿐 아니라 자식과 부모 정보까지 관리합니다.
Transform 클래스는 대략 다음과 같은 구조를 가지고 있다고 생각하면 됩니다
class Transform
{
public Vector3 position;
public Quaternion rotation;
public Vector3 scale;
public Transform parent;
public List<Transform> children;
// 기타 메서드들...
}
이처럼 Transform은 자신이 어떤 부모(Parent)를 가지는지, 그리고 자식(Children)을 얼마나 가지는지에 대한 정보를 모두 포함하고 있기 때문에, foreach (Transform child in parent) 같은 문법이 가능해지는 것입니다.
계층 구조 예시와 코드 적용
예를 들어 다음과 같은 구조를 가지고 있는 오브젝트가 있다고 가정해봅니다.
Hierarchy 구조
- StarGroup (부모 오브젝트)
- Star1
- Star2
- Star3
public class StarManager : MonoBehaviour
{
public Transform starGroup;
public List<Transform> starList = new List<Transform>();
void Start()
{
foreach (Transform child in starGroup)
{
starList.Add(child);
}
}
}
이렇게 하면 Hierarchy 상에서 Inspector 에서 자식 오브젝트를 하나하나 리스트에 등록하지 않고, StarGroup만 연결해두면 코드로 자동 등록할 수 있습니다.
변수 타입이 GameObject 가 아닌 Transform 이라는 것에 주의해야 합니다.
Transform.GetChild()
사실 이 문법은 유니티 내부에서 `Transform.GetChild(int index)`를 반복 호출하는 방식으로 구현되어 있습니다.
즉, `foreach (Transform child in parent)`는 자동으로 자식 수만큼 `GetChild(i)`를 호출하는 편리한 축약 표현입니다. 이 덕분에 코드는 훨씬 깔끔해지지만, 실제로는
for (int i = 0; i < parent.childCount; i++) 같은 루프와 본질적으로 동일한 동작을 수행합니다.
for (int i = 0; i < transform.childCount; i++)
{
Transform child = transform.GetChild(i);
Debug.Log(child.name);
}
따라서 특정 순서로 접근하거나 역순으로 순회해야 하는 경우에는 `for` 루프를 사용하는 것이 더 적합할 수 있습니다.
마무리
유니티의 부모-자식 구조는 Transform을 통해 관리됩니다. 이를 이해하고 나면 Hierarchy를 잘 구성하는 것만으로도 훨씬 유연하고 깔끔한 코드 구성이 가능해집니다.
특히 자식 오브젝트가 많을 때, 일일이 Inspector에 등록하는 수고를 줄이고, 유지보수가 쉬운 구조를 만들 수 있습니다.
'Unity' 카테고리의 다른 글
코루틴의 한계 : 일시 정지가 불가능한 구조 (0) | 2025.04.27 |
---|---|
Unity에서 Enum을 Dictionary로 연결하여 Hierarchy 자식 관리하기 (0) | 2025.04.27 |
유니티에서 SerializeField 란 무엇인가요? (0) | 2025.04.20 |
Unity 에서 지체없이 Play Mode 로 진입하는 방법 (0) | 2025.04.14 |
Audio Clip 을 Dictionary 로 관리하기 : Serializable 과 List 활용 (0) | 2025.04.08 |