유니티에서 GetComponent 계열 메서드는 게임 오브젝트에서 특정 타입의 컴포넌트를 찾을 때 매우 유용하다.
그러나 이 메서드들은 성능에 영향을 줄 수 있기 때문에, 올바르게 사용하는 것이 중요하다.
이번 글에서는 GetComponent 메서드의 종류와 최적화 방법에 대해 자세히 알아보겠다.
GetComponent 메서드의 종류
유니티에서는 다양한 GetComponent 메서드가 있다.
GetComponent<T>()
GetComponent<T>() 메서드는 현재 게임 오브젝트에서 타입 T의 컴포넌트를 찾는다.
찾으면 해당 컴포넌트를 반환하고, 없으면 null을 반환한다.
var animator = GetComponent<Animator>();
GetComponents<T>()
GetComponents<T>() 메서드는 현재 게임 오브젝트에서 타입 T의 모든 컴포넌트를 배열로 반환한다.
var rendererList = GetComponents<MeshRenderer>();
GetComponentInChildren<T>(bool includeInactive = false)
GetComponentInChildren<T>() 메서드는 현재 게임 오브젝트와 그 자식들 중에서 타입 T의 컴포넌트를 찾는다.
includeInactive 매개변수를 true로 설정하면 비활성화된 자식에서도 검색한다.
찾으면 첫 번째 일치하는 컴포넌트를 반환하고, 없으면 null을 반환한다.
var animator = GetComponentInChildren<Animator>(true);
GetComponentsInChildren<T>(bool includeInactive = false)
GetComponentsInChildren<T>() 메서드는 현재 게임 오브젝트와 그 자식들 중에서 타입 T의 모든 컴포넌트를 배열로 반환한다. includeInactive 매개변수를 true로 설정하면 비활성화된 자식에서도 검색한다.
var rendererList = GetComponentsInChildren<MeshRenderer>();
GetComponentInParent<T>()
GetComponentInParent<T>() 메서드는 현재 게임 오브젝트와 그 부모들 중에서 타입 T의 컴포넌트를 찾는다.
찾으면 첫 번째 일치하는 컴포넌트를 반환하고, 없으면 null을 반환한다.
var canvas = GetComponentInParent<Canvas>();
GetComponentsInParent<T>(bool includeInactive = false)
GetComponentsInParent<T>() 메서드는 현재 게임 오브젝트와 그 부모들 중에서 타입 T의 모든 컴포넌트를 배열로 반환한다.
includeInactive 매개변수를 true로 설정하면 비활성화된 부모에서도 검색한다.
var canvasList = GetComponentsInParent<Canvas>(true);
최적화 방법
GetComponent 계열 메서드는 매 프레임마다 호출하면 성능에 영향을 줄 수 있다.
특히, 자주 호출되는 경우 이를 최적화하는 것이 중요하다.
Awake 또는 Start에서 캐싱하기
GetComponent 호출 결과를 Start 또는 Awake 메서드에서 캐싱하여, 이후에는 캐시된 값을 사용한다.
private Animator animator;
void Awake()
{
if(animator == null)
animator = GetComponent<Animator>();
}
하이어라키에서 계층구조 순서 조정하기
GetComponent는 하이어라키에서 위에서 순서대로 찾으므로 컴포넌트가 달린 오브젝트를 위로 올려놓는것도 좋다.
주의사항
GetComponent 메서드는 런타임에 호출할 때마다 성능에 영향을 줄 수 있다.
특히, 반복적으로 호출하거나, 많은 오브젝트에서 호출할 경우 성능 저하가 발생할 수 있다.
그러므로 캐싱을 해서 사용하도록 하자.
GetComponent 메서드가 반환하는 값이 null일 수 있다.
찾으려는 Component가 없으면 null이 반환되므로 예외처리를 꼭 하자.
GetComponentInChildren 메서드는 계층 구조의 깊이에 따라 검색 시간을 더 많이 소요할 수 있다.
계층 구조가 깊을수록 성능에 영향을 줄 수 있다.
찾고자 하는 컴포넌트를 계층 구조 상위에 배치하여 검색 시간을 줄이자.
GetComponents와 GetComponentsInChildren 같이 모든 스크립트를 찾는 메서드를 사용할때
s가 잘 들어가있는지 확인 하자 특히 GetComponentsInChildren 같은건 단어 사이에 s가 들어가서
구별하기 힘들다 꼭 체크 해서 사용하자.
'Unity' 카테고리의 다른 글
Unity 외부 링크 열기 (1) | 2024.12.04 |
---|---|
코딩 표기법 (카멜, 파스칼, 헝가리안, 스네이크) (0) | 2024.07.19 |
Dictionary, Hashtable, HashSet의 비교와 사용법 (3) | 2024.07.14 |
Serializable과 SerializeField의 역할과 활용 (0) | 2024.07.09 |
랜덤값 구하기 Vector2, Vector3 (0) | 2024.07.05 |