유니티에서 사용하는 게임 오브젝트는 각각의 이름이 존재하고, 이를 분류하기 위해 Tag, Layer라는 두 가지 요소를 사용한다. 두 요소가 정확히 무슨 차이이고, 어떻게 사용되는지 알아보자.

아무 게임 오브젝트나 선택한 후 인스펙터 창에서 Tag나 Layer를 클릭하고 하단 [Add Tag] 또는 [Add Layer]를 클릭하면 Tag & Layers 창으로 이동되며, 이곳에서 태그와 레이어를 관리할 수 있다.

태그는 각 게임 오브젝트를 분류하는 용도로 사용한다. 해당 게임 오브젝트가 어떤 카테고리에 속하는지 태그로 구분할 수 있다.
대표적인 사용 예시로는 충돌을 검사하는 OnCollision 혹은 OnTrigger 계열의 함수에서 대상 게임 오브젝트와 충돌한 게임 오브젝트의 종류가 무엇인지에 따라 다르게 처리해주는 방법이 있다.
/* MonsterController.cs */
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.transform.CompareTag("PlayerAttack"))
{
OnDamage(collision.transform);
}
}
게임 내 몬스터가 플레이어의 공격으로부터 대미지를 입게 하기 위해 위와 같이 충돌 처리를 해준다면 플레이어의 공격으로부터만 대미지를 입도록 설정해주어야 한다. 벽이나 기타 오브젝트에 충돌했을 때도 대미지를 입으면 게임에 치명적인 오류가 생길 것이다. 이럴 때 충돌한 게임 오브젝트의 태그로 검사하는 방식을 많이 사용한다.
이때 CompareTag라는 함수를 이용했는데, 다음과 같이 태그를 비교해줄 수도 있다.
if (collision.tag == "PlayerAttack"){ ... }
if (collision.tag.Equals("PlayerAttack")){ ... }
이처럼 태그를 확인하여도 정상적으로 실행하기 때문에 당장은 큰 문제가 되지 않지만, 게임의 규모가 커질수록 문제가 드러난다. 위의 방식은 문자열 비교 방식을 이용하여 태그를 확인하는데, 이때 문자열을 가져오기 위해 문자열의 복사본을 생성하게 되고 유니티의 시스템상 복사본을 생성할 때 GC(Garbage collector)가 호출되기 때문에 성능적인 문제를 초래할 수 있다.
이러한 이유로 태그 비교 외에도 문자열을 비교하거나 GC를 호출하는 경우를 공부하여 다른 방법을 이용하는 것이 시스템 최적화에 도움을 준다.


[1] 유니티 레이어와 태그 (Layers and Tags)
[2] #6 유니티 태그(Tag), 레이어(Layer)
[3] 레이어와 소팅레이어(Layer & Sorting Layer