Unity로 게임을 개발하다 보면 다양한 오브젝트 간 상호작용이 필연적으로 발생하게 되고, 특히 충돌처리나 이벤트 발생 시 어떤 유닛인지 판별하는 작업이 매우 중요해진다. 이때 흔히 사용되는 방식은 문자열을 통한 비교인데, 대표적으로 3가지가 있다.
- 이름으로 비교
- tag로 비교
- 레이어로 비교
유닛을 판별하는 3가지 방식 각각의 사용법과 장단점에 대해 정리해보았다.
1. 이름으로 비교
void OnCollisionEnter (Collision collision)
{
if (collision.name == "Enemy") { return; }
}
● 충돌체의 이름이 "Enemy"면 코드 실행
(1) 장점
- 직관성이 높다 : 판별하고자 하는 유닛의 이름이 명확할 경우, 직관적으로 구분이 가능하다.
- 유일한 유닛을 명확히 지정할 수 있어서, 개별 유닛 식별에 유리하다.
- 오브젝트의 name은 하이어라키 창에도 표시되기 때문에, 추적하기 쉽다.
(2) 단점
- 문자열을 비교해야하기 때문에, 성능이 저하될 수 있다.
- 문자열 하드코딩에 의한 오타의 위험이 높다.
- 프리팹 복사 시 이름이 중복될 수 있다.
2. Tag로 비교
void OnCollisionEnter (Collision collision)
{
if (collision.CompareTag("Enemy")) { return; }
}
● 충돌체의 tag가 "Enemy"면 코드 실행
(1) 장점
- 유니티에서 최적화한 메서드라 성능이 높다.
- 의미 기반 분류 : "Player" "Enemy" "NPC" 등 논리적 그룹을 지정할 수 있다.
- CompareTag()는 null 체크를 포함하기 때문에 NullReferenceException을 방지할 수 있다.
(2) 단점
- 한 오브젝트당 하나의 태그만 사용 가능.
- 태그 목록이 많아지면 태그 관리가 어려워짐.
- CompareTag()에 미등록한 Tag를 매개변수로 넣으면 오류 발생
3. 레이어로 비교
void OnCollisionEnter (Collision collision)
{
if (collision.layer == LayerMask.NameToLayer("Enemy")) { return; }
}
● 충돌체의 레이어가 "Enemy"면 코드 실행
(1) 장점
- 최상의 성능 : 내부적으로 int값 비교이기 때문에 매우 빠르다.
- 충돌 필터링이 가능하다.
- 렌더링, 카메라, 물리 처리를 분리할 수 있다.
- 다중 객체에 그룹 적용이 쉽다.
(2) 단점
- 레이어 이름만으로 역할을 명확히 표현하는데 한계가 있다.
- 최대 32개 제한.
- 태그와 마찬가지로, 한 오브젝트에 하나의 레이어만 사용 가능하다.
<사용 용도 정리>
- 이름 사용 : 특정 개별체를 체크하는데 사용. 잘 사용하지 않음.
- ex) 특정 보스몬스터, 특정 npc, 등등
- 태그 사용 : 역할을 구분할 때 사용
- ex) "Player", "Enemy", "Npc", "Item", 등등
- 레이어 사용 : 물리적 필터링 / 최적화에 사용
- "Ground", "UI", "Hitbox", 등등
'Unity 개발 일지 > 코딩 공부' 카테고리의 다른 글
Mathf 클래스 (0) | 2025.05.01 |
---|---|
델리게이트(delegate) (0) | 2025.04.30 |
new 키워드 (1) | 2025.04.18 |
열거형 (Enum) (0) | 2025.04.15 |
프로퍼티와 getter/setter 메서드 (0) | 2025.04.11 |