Unity 개발 일지/코딩 공부

Unity에서 유닛을 판별하는 방법

ohty20012 2025. 5. 2. 21:06

Unity로 게임을 개발하다 보면 다양한 오브젝트 간 상호작용이 필연적으로 발생하게 되고, 특히 충돌처리나 이벤트 발생 시 어떤 유닛인지 판별하는 작업이 매우 중요해진다. 이때 흔히 사용되는 방식은 문자열을 통한 비교인데, 대표적으로 3가지가 있다.

  1. 이름으로 비교
  2. tag로 비교
  3. 레이어로 비교

유닛을 판별하는 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