본문 바로가기
Unity

GameObject 와 Transform 의 Find() 에 대해

by Oz Driver 2025. 3. 10.

유니티에서 오브젝트를 검색하는 방법은 크게 두 가지가 있습니다.

첫 번째는 GameObject.Find() 를 사용하여 씬 전체에서 검색하는 것이고, 두 번째는 Transform.Find()를 사용하여 특정 부모 오브젝트의 자식에서 검색하는 것입니다.

각각의 방법은 사용 목적과 성능 차이가 있으므로 적절한 상황에서 선택하여 사용해야 합니다.

 

 

GameObject에서 Find 함수 사용하기

GameObject는 씬 내의 모든 활성화된 게임 오브젝트를 검색할 때 사용됩니다. 대표적인 함수들은 다음과 같습니다.

 

GameObject.Find ( name )

씬 전체에서 특정 이름을 가진 오브젝트를 찾습니다.

 

GameObject.FindWithTag ( tag ) 

특정 태그를 가진 오브젝트를 찾습니다.

 

GameObject.FindGameObjectsWithTag ( tag ) 

특정 태그를 가진 모든 오브젝트를 배열로 반환합니다.

 

이 함수들은 씬 전체를 검색하므로 성능 저하의 원인이 될 수 있습니다. 따라서 게임 실행 중 반복적으로 호출하는 것은 피해야 합니다. 가능하면 오브젝트를 미리 저장해서 참조하는 방식이 더 효율적입니다.

// 씬 전체에서 "Player"라는 이름의 오브젝트 찾기
GameObject player = GameObject.Find("Player");

// "Enemy" 태그를 가진 오브젝트 찾기
GameObject enemy = GameObject.FindWithTag("Enemy");

// "Enemy" 태그를 가진 모든 오브젝트 찾기
GameObject[] enemies = GameObject.FindGameObjectsWithTag("Enemy");

 

 

Transform에서 Find 함수 사용하기

Transform은 특정 부모 오브젝트의 자식 오브젝트를 찾을 때 사용됩니다. 대표적인 함수들은 다음과 같습니다.

Transform.Find ( name )

현재 Transform의 자식 중 특정 이름을 가진 오브젝트를 찾습니다.

 

Transform.GetChild ( index )

특정 인덱스의 자식 오브젝트를 반환합니다.

 

Transform.GetComponentsInChildren()

 

특정 컴포넌트를 가진 모든 자식 오브젝트를 배열로 가져옵니다.

이 함수들은 부모 오브젝트 내에서만 검색이 이루어지므로 씬 전체를 검색하는 GameObject.Find()보다 성능이 뛰어납니다. 하지만 문자열을 기반으로 검색하므로 오브젝트 이름이 변경될 경우 오류가 발생할 수 있습니다.

// 특정 부모 오브젝트의 자식에서 "Weapon"을 찾기
Transform weapon = player.transform.Find("Weapon");

// 첫 번째 자식 오브젝트 찾기
Transform firstChild = player.transform.GetChild(0);

// 모든 자식 오브젝트에서 Collider 컴포넌트 가져오기
Collider[] colliders = player.GetComponentsInChildren<Collider>();

 

 

Find 계열 함수 사용 시 주의사항

GameObject.Find() 계열 함수는 씬 전체를 탐색하므로 성능 저하가 발생할 수 있으며, 자주 호출하는 것은 바람직하지 않습니다. 오브젝트를 미리 저장하여 참조하는 방식을 고려해야 합니다.

 

Transform.Find() 는 특정 부모 오브젝트 내에서 검색하므로 상대적으로 성능이 뛰어나지만, 문자열 기반 검색의 단점을 가지고 있습니다. 따라서 가능하면 직접 참조하거나, Inspector에서 변수로 할당하는 방식을 사용하는 것이 좋습니다.

 

Find 계열 함수는 편리하지만 남발하면 성능 저하 및 유지보수 문제를 초래할 수 있으므로 주의가 필요합니다.