Unity에서는 게임 오브젝트의 태그를 비교할 때 여러 가지 방법이 있지만, 성능과 안정성을 고려하면 CompareTag()를 사용하는 것이 가장 효율적입니다.
이 글에서는 태그 비교 및 검색 함수의 동작 원리를 설명하고, 어떤 방식이 최적화된 방법인지 알아보겠습니다.
Tag 를 비교하는 두 가지 방법
CompareTag() 사용 (권장)
if (collision.gameObject.CompareTag("Player"))
Unity 내부적으로 태그를 정수 ID로 변환하여 비교.
문자열 비교를 하지 않으므로 빠르고 최적화됨.
태그가 존재하지 않는 경우에도 안전하게 처리됨.
tag 속성으로 비교 (비추천)
if (collision.gameObject.tag == "Player")
gameObject.tag를 가져와서 문자열 비교 수행.
태그가 존재하지 않는 경우 예외 발생 가능.
CompareTag()보다 성능이 떨어짐.
Unity의 Tag 최적화 원리
Unity는 프로젝트에서 사용되는 모든 태그를 정수 ID로 변환하여 저장합니다. 따라서 태그를 비교할 때 문자열이 아닌 정수 ID를 활용하면 성능이 향상됩니다.
비유적으로, Unity가 내부적으로 다음과 같이 동작한다고 가정할 수 있습니다:
"Player" 태그가 정수 ID 5로 등록됨
CompareTag("Player") 는 내부적으로 if (tagID == 5)처럼 처리됨
tag == "Player"는 문자열 비교(if ("Player" == "Player"))가 수행되므로 더 느림
태그 검색 함수도 같은 방식으로 최적화됨
태그를 이용한 검색 함수도 동일한 원리로 동작합니다. FindWithTag()는 태그를 정수 ID로 변환한 후 검색하므로, 문자열을 직접 비교하는 Find()보다 빠릅니다.
FindWithTag() (권장)
GameObject player = GameObject.FindWithTag("Player");
태그를 정수 ID로 변환하여 검색
씬의 모든 오브젝트를 순회하며 정수 ID 비교 수행
성능이 최적화됨
Find() + tag 비교 (비추천)
GameObject player = GameObject.Find("SomeObject");
if (player != null && player.tag == "Player") { ... }
Find()는 이름 기반 검색이므로 문자열 비교 발생.
이후 tag == "Player"도 문자열 비교 수행.
FindWithTag()보다 비효율적.
정리
* 태그를 비교할 때는 항상 CompareTag() 를 사용합니다.
* 태그를 이용해 오브젝트를 찾을 때는 FindWithTag() 를 사용하는 것이 성능적으로 유리합니다.
* 문자열 비교 ( tag == "Player" ) 는 피하는 것이 좋습니다.
Unity의 태그 시스템은 내부적으로 정수 ID 기반으로 동작하기 때문에, 이를 활용한 최적화된 방법을 사용하는 것이 중요합니다. 이러한 원리를 이해하면, 성능을 더욱 효율적으로 관리할 수 있습니다.
'Unity' 카테고리의 다른 글
UIManager를 활용한 효율적인 UI 업데이트 구조 (0) | 2025.03.11 |
---|---|
FindObjectOfType<T>() 함수 설명 (0) | 2025.03.10 |
유니티 Inspector 설정 값을 전역으로 사용하기 (0) | 2025.03.10 |
GameObject 와 Transform 의 Find() 에 대해 (0) | 2025.03.10 |
유니티에서 특정 오브젝트 찾기 : 성능 최적화 (0) | 2025.03.09 |