
유니티에서 GetComponent 계열 메서드는 게임 오브젝트에서 특정 타입의 컴포넌트를 찾을 때 매우 유용하다.
그러나 이 메서드들은 성능에 영향을 줄 수 있기 때문에, 올바르게 사용하는 것이 중요하다.
이번 글에서는 GetComponent 메서드의 종류와 최적화 방법에 대해 자세히 알아보겠다.
1. GetComponent란?
Unity에서 GetComponent는 게임 오브젝트에 붙은 다른 컴포넌트를 가져오는 함수입니다.
스크립트 간 상호작용을 위해 자주 쓰이죠.
예를 들어, 같은 오브젝트에 붙은 Animator를 가져오려면:
Animator anim = GetComponent<Animator>();
anim.Play("Run");
이처럼 간단하지만, 빈번히 호출되면 성능에 영향을 주는 함수이기도 합니다.
아래에서 종류별 차이와 최적화 포인트를 정리해볼게요.
2. GetComponent 계열 함수 종류
| 함수 | 설명 | 탐색 범위 |
| GetComponent<T>() | 자기 자신에서 타입 T의 컴포넌트를 반환 | 자기 자신 |
| GetComponentInChildren<T>() | 자신 및 자식 오브젝트에서 탐색 | 자신 포함 모든 자식 |
| GetComponentInParent<T>() | 자신 및 부모 오브젝트에서 탐색 | 자신 포함 모든 부모 |
| GetComponents<T>() | 자신에게 붙은 타입 T의 모든 컴포넌트 배열 반환 | 자기 자신 |
| GetComponentsInChildren<T>() | 자신 및 자식에 붙은 T의 모든 컴포넌트 배열 반환 | 자신 포함 모든 자식 |
| TryGetComponent<T>(out T component) | GetComponent의 예외 안전 버전 (없으면 false 반환) | 자기 자신 |
3. 성능과 내부 동작
GetComponent는 생각보다 가볍지 않습니다.
엔진 내부적으로 게임 오브젝트의 컴포넌트 리스트를 순회하며 타입을 검사하기 때문입니다.
- GetComponent<T>(): 현재 오브젝트 내 리스트 한 번 탐색 (상대적으로 빠름)
- GetComponentInChildren<T>(): 전체 하위 트랜스폼 탐색 (깊이에 비례해 느려짐)
- GetComponents<T>(): 배열 생성 + 모든 매칭 항목 복사 → 할당 비용 발생
즉, 매 프레임 호출은 피해야 하며, 캐싱이 필수적입니다.
✅ 올바른 캐싱 예시
public class PlayerController : MonoBehaviour
{
private Rigidbody _rb;
void Awake()
{
// 한 번만 가져오고 캐싱
_rb = GetComponent<Rigidbody>();
}
void Update()
{
_rb.MovePosition(transform.position + Vector3.forward * Time.deltaTime);
}
}
❌ 잘못된 예시
void Update()
{
// 매 프레임 호출 → 불필요한 비용 발생
GetComponent<Rigidbody>().MovePosition(transform.position + Vector3.forward * Time.deltaTime);
}
4. TryGetComponent로 안전하게 사용하기
Unity 2019 이후로 추가된 TryGetComponent는 GetComponent보다 안전합니다.
null 반환 대신 bool 값을 반환하므로 null 체크를 깔끔히 처리할 수 있죠.
if (TryGetComponent(out Animator anim))
{
anim.Play("Idle");
}
이 방식은 null 비교보다 가독성이 좋고,
GetComponent 결과를 매번 변수에 할당하지 않아도 됩니다.
최적화 방법
GetComponent 계열 메서드는 매 프레임마다 호출할 경우 성능에 영향을 줄 수 있습니다.
특히 자주 호출되는 상황에서는 반드시 최적화가 필요합니다.
1. Awake 또는 Start에서 캐싱하기
GetComponent의 결과를 한 번만 호출하고, 이후에는 캐싱된 값을 사용하는 것이 좋습니다.
private Animator animator;
void Awake()
{
if (animator == null)
animator = GetComponent<Animator>();
}
이렇게 하면 매번 GetComponent를 호출하지 않아도 되므로, 성능 저하를 방지할 수 있습니다.
2. 하이어라키 순서 조정하기
GetComponent는 하이어라키(Hierarchy) 상에서 위쪽부터 순서대로 검색합니다.
따라서, 자주 접근해야 하는 컴포넌트가 붙은 오브젝트를 상위에 배치하면 약간의 성능 향상을 기대할 수 있습니다.
주의사항
- GetComponent는 런타임 호출 시마다 성능에 영향을 줍니다.
반복 호출이나 다수의 오브젝트에서 사용될 경우 프레임 드랍의 원인이 될 수 있습니다.
→ 가능하면 캐싱 후 재사용하는 방식을 권장합니다. - GetComponent는 null을 반환할 수 있습니다.
찾으려는 컴포넌트가 존재하지 않으면 null이 반환되므로, 예외 처리를 반드시 추가하세요. - GetComponentInChildren은 계층 구조의 깊이에 비례해 탐색 시간이 증가합니다.
깊은 구조일수록 성능에 불리하므로, 가능한 한 컴포넌트를 상위 계층에 배치하는 것이 좋습니다. - GetComponents, GetComponentsInChildren처럼 모든 스크립트를 한 번에 찾는 메서드는
이름에 들어 있는 s를 빼먹기 쉽습니다.
GetComponent와 GetComponents를 혼동하지 않도록 주의하세요.
'Unity' 카테고리의 다른 글
| 유니티에서 안드로이드 로그캣(Android Logcat) 사용하는 방법 (0) | 2025.06.16 |
|---|---|
| Unity 외부 링크 열기 (1) | 2024.12.04 |
| 코딩 표기법 (카멜, 파스칼, 헝가리안, 스네이크) (0) | 2024.07.19 |
| Dictionary, Hashtable, HashSet의 비교와 사용법 (3) | 2024.07.14 |
| Serializable과 SerializeField의 역할과 활용 (0) | 2024.07.09 |