본문 바로가기
Unity

유니티에서 특정 오브젝트 찾기 : 성능 최적화

by Oz Driver 2025. 3. 9.

만약 특정한 오브젝트를 찾기 위해 Unity에서 씬 상의 모든 오브젝트를 확인하려고 한다면, 모든 오브젝트를 순회하며 검사해야 합니다.

Unity에는 씬에 존재하는 오브젝트를 순회하고 특정 조건에 맞는 오브젝트를 찾는 방법이 여러 가지가 있지만, 기본적으로는 모든 오브젝트를 확인하는 과정이 필요합니다.

 

 

오브젝트를 찾는 방법

FindObjectsOfType<T>() 사용

Unity에서 특정 타입의 컴포넌트를 가진 오브젝트를 찾고 싶다면 FindObjectsOfType<T>() 메서드를 사용할 수 있습니다.

이 메서드는 씬에 있는 모든 오브젝트를 순회하며, 해당 타입의 컴포넌트를 가지고 있는 오브젝트들을 찾아 반환합니다.

 

GameObject[] allEnemies = FindObjectsOfType<GameObject>().Where(obj => obj.layer == LayerMask.NameToLayer("Enemy")).ToArray();

 

이 코드는 씬에 있는 모든 오브젝트 중에서 "Enemy" 레이어에 속한 오브젝트들만 찾아 배열로 반환하는 예시입니다.

이때도 모든 오브젝트를 확인한 후에 조건에 맞는 오브젝트만 필터링하게 됩니다.

 

 GameObject.Find() 또는 GameObject.FindWithTag() 사용

GameObject.Find("name")

이름으로 오브젝트를 찾습니다.

하지만 이 방법도 씬에 존재하는 모든 오브젝트를 검사하여 이름이 일치하는 오브젝트를 찾아냅니다.

 

GameObject.FindWithTag("tag")

특정 태그를 가진 오브젝트를 찾습니다. 태그로 검색하는 경우에도 씬 상의 모든 오브젝트를 확인한 후 해당 태그를 가진 오브젝트를 반환합니다.

 

두 방식 모두 내부적으로는 string (문자열) 비교를 하기 때문에 성능상 큰 차이는 없겠으나, Tag 방식이 내부적으로 분류를 해놨을 가능성이 있기 때문에 ... 성능상 조금 더 잇점이 있을거라 생각하고, 그 외 다른 장점들이 있기 때문에 FindWithTag () 를 사용하는 편이 조금 더 낫다고 생각합니다.

 

성능 고려 사항

씬에 오브젝트가 많아질수록, 모든 오브젝트를 검사하는 작업은 성능에 부담이 될 수 있습니다.

특히, 매 프레임마다 오브젝트를 찾아야 하는 상황이라면, 성능에 큰 영향을 미칠 수 있습니다.

따라서, 태그나 레이어를 활용하거나, 필요한 경우 캐싱하여 성능 저하를 방지하는 것이 좋습니다.

 

 

성능 최적화 방법

필요할 때만 검색

오브젝트를 매번 찾는 대신, 처음에 찾은 후 해당 오브젝트를 변수에 캐싱해 두는 것이 좋습니다.

 

레이어나 태그를 사용

특정 레이어나 태그를 사용하는 방법으로 오브젝트의 범위를 좁히면 불필요한 연산을 줄일 수 있습니다.

 

정적 오브젝트는 미리 할당

씬에 존재하는 오브젝트가 정적이거나 바뀌지 않는다면, 스크립트에서 미리 할당해 두고 나중에 참조하는 방식으로 성능을 개선할 수 있습니다.

 

 

정리

씬에 있는 오브젝트를 찾기 위해서는 기본적으로 씬에 존재하는 모든 오브젝트를 순회하면서 조건에 맞는 오브젝트를 확인하는 과정이 필요합니다. 성능을 고려하여 적절한 방법을 선택하고, 가능한 한 검색 범위를 줄이거나, 처음에 찾은 오브젝트를 캐싱하여 성능 최적화를 고려하는 것이 중요합니다.