🔎 transform.Find()를 사용하는 이유와 인스펙터 할당 방식과의 차이
- Unity에서 특정 UI 오브젝트나 자식 오브젝트에 접근할 때, 종종 아래와 같은 형태로 코드를 작성하게 된다.
scoreText = transform.Find("ScoreTxt")?.GetComponent<TextMeshProUGUI>();
- 이 방식은 지정된 이름을 가진 자식 오브젝트를 런타임 중에 찾아 해당 컴포넌트를 가져오는 구조이다.
- 자식 오브젝트의 계층 구조가 명확하거나, 오브젝트가 코드로 동적으로 생성될 때 유용하게 사용할 수 있다.
- 그러나 자주 접근하거나 구조가 고정된 컴포넌트라면, 인스펙터에서 Drag & Drop으로 직접 할당해주는 방식이 더 안전하고 성능적으로도 유리하다.
- 특히 Find()는 문자열 기반 탐색이기 때문에 오타가 있어도 컴파일 오류가 발생하지 않고 런타임 중 문제를 일으킬 수 있는 점이 치명적이다.
- 따라서 Unity에서는 보통 다음과 같은 기준으로 사용하는 것이 적절하다:
1. 구조가 고정되어 있고 자주 사용하는 컴포넌트 → 인스펙터 연결
2. 구조가 동적이거나 자식이 동적으로 생기는 경우 → transform.Find() 사용
🧩 transform이 기준이 되는 이유
🔹 1. Unity의 모든 GameObject는 Transform을 가진다
- Unity에서 모든 GameObject는 Transform 컴포넌트를 반드시 가지고 있다.
- 그리고 이 Transform은 다음 두 가지 역할을 한다:
- 게임 오브젝트의 위치, 회전, 크기(SRT)를 관리한다.
- 부모-자식 계층 구조에서 노드 역할을 하며, 트리 구조를 형성한다.
- 즉, Transform은 단순한 위치 정보가 아니라, 계층 구조 전체의 연결 고리이자 탐색 기준점이 된다.
🔹 2. transform.Find()는 트리 기반의 하위 탐색이다
- transform.Find("ScoreTxt")는 현재 GameObject의 Transform을 루트로 하는 하위 트리 구조 안에서 "ScoreTxt"라는 이름을 가진 자식 오브젝트를 탐색한다.
- 이는 전체 씬에서 검색하는 것이 아니라, 현재 Transform 하위에서만 찾는 방식이다.
- 구조가 명확한 UI 계층이나 자식 오브젝트 트리 안에서 효율적으로 사용할 수 있다.
🔹 3. 부모 - 자식 관계 = Transform 간의 종속 관계
- Unity에서 두 GameObject가 부모-자식 관계에 있다고 할 때, 이는 사실상 Transform 간의 종속 관계를 의미한다.
- 자식 오브젝트의 위치는 부모 오브젝트의 Transform을 기준으로 한다 (로컬 좌표계)
- 부모를 회전시키면 자식도 같이 회전하며
- 부모의 스케일을 변경하면 자식의 스케일도 영향을 받는다
이러한 종속성은 SRT (Scale, Rotation, Translation) 트랜스폼 체계에 기반을 두고 있다.
🔹 4. transform이 아닌 전체에서 탐색하고 싶다면?
- 만약 씬 전체에서 특정 이름의 오브젝트를 찾고 싶다면 다음과 같이 GameObject.Find()를 사용할 수 있다.
GameObject.Find("ScoreTxt")?.GetComponent<TextMeshProUGUI>();
- 하지만 이 방식은 다음과 같은 단점이 있다:
1. 성능이 나쁘다. (전체 씬을 탐색)
2. 비활성화된 오브젝트는 찾지 못한다.
3. 이름이 중복되면 예기치 못한 결과가 발생할 수 있다.
- 따라서 UI나 계층 구조 안에서 탐색할 경우에는 transform.Find()가 더 안전하고 적절한 방식이다.
✅ 정리
- transform.Find()는 자신의 하위 트리에서 이름 기반으로 자식 오브젝트를 탐색하는 기능이다.
- 구조가 고정되어 있으면 인스펙터 할당이 더 안전하며, 구조가 동적이면 Find()가 적합하다.
- Find()는 런타임 오류 유발 가능성이 있고, 성능도 고려해야 하므로 신중히 사용하는 것이 좋다.
- 전체 씬 탐색이 필요할 경우 GameObject.Find()도 가능하지만, 제한사항이 많으므로 최후의 수단으로 사용하는 것이 바람직하다.
'Programming > Unity 정보, 기능' 카테고리의 다른 글
| Unity 간단 기능 정리 모음 #6 (2) | 2025.07.28 |
|---|---|
| Unity 기능 - FindObjectOfType 호출 시점 (0) | 2025.07.23 |
| Unity 기초 개념 정리 모음 #5 (1) | 2025.07.23 |
| Unity 생성 주기 - 인스펙터 값 반영 문제 (0) | 2025.07.02 |
| Unity 2D 기능 - 애니메이션 녹화 (0) | 2025.07.01 |
