Unity에서 특정 레이어를 선택하거나 필터링할 때 사용되는 데이터 타입. 주로 Raycast, Physics 연산, 충돌 감지 등에서 특정 레이어에 속한 오브젝트만 감지하거나 무시할 때 활용
Unity에서 Layer는 32비트 정수 값(0~31)으로 표현된다.
각 비트는 특정 Layer를 의미하고, 여러개의 Layer를 조합하여 사용할 수 있다.
따라서 Layer Mask는 32개만 만들 수 있다.

오브젝트에게 해당 layer를 붙히면 그 Layer에 해당하는 오브젝트들만을 대상으로 Raycasting을 할 수 있고 카메라 오브젝트에 Culling Mask로 어떤 Layer Mask를 지정하면 그 Layer를 가진 오브젝트만에 카메라에 랜더링된다.
Layer Mask를 사용하면 부하를 줄일 수 있다.

위아 같이 8번과 9번에 각각 Monster와 Wall이라는 Layer를 만들어 놓았다.
int mask = (1 << 8); // 8 번 레이어
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100.0f, mask))
{
Debug.Log(hit.collider.gameObject.name);
}
int mask = (1 << 8) | (1 << 9); // 8 번 레이어 + 9 번 레이어
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100.0f, mask))
{
Debug.Log(hit.collider.gameObject.name);
}
LayerMask mask = LayerMask.GetMask("Monster") | LayerMask.GetMask("Wall")/
// int mask = (1 << 8) | (1 << 9); 와 동일
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100.0f, mask))
{
Debug.Log(hit1.collider.gameObject.name);
}
큰 기능은 없고 오브젝트들을 그룹지어 구분해주기 위한 정보
GameObject.FindGameObjectWithTag("Monster");
Debug.Log(hit.collider.gameObject.tag);
위와 같이 코드를 작성하면 게임 오브젝트의 태그를 찾아낼 수 있게 된다.
🚀 가능! 서로 다른 역할을 하므로 같이 쓰면 더 효과적!
예제: 특정 태그(Enemy)를 가진 오브젝트 중 특정 레이어(Ground 또는 Water)만 감지
LayerMask mask = LayerMask.GetMask("Ground", "Water");
if ((mask.value & (1 << other.gameObject.layer)) != 0 && other.CompareTag("Enemy"))
{
Debug.Log("Ground 또는 Water 위에 있는 적 감지!");
}
| LayerMask | Tag | |
|---|---|---|
| 용도 | 충돌, 물리 연산, 레이캐스트 등의 레이어 필터링 | 특정한 오브젝트를 식별 |
| 데이터 타입 | LayerMask (비트 연산 사용) | string (문자열) |
| 설정 방식 | 0~31까지 총 32개의 레이어 슬롯 제공 | 여러 개의 태그 생성 가능 (오브젝트마다 1개만 설정 가능) |
| 주요 기능 | 1. 특정 오브젝트 그룹에 대한 충돌 감지 2. 특정 레이어만 Raycast 감지 | 1. 개별 오브젝트의 역할을 구분하는 용도 |
| 인스펙터에서 설정 | ✅ 가능 (드롭다운 선택) | ✅ 가능 (드롭다운 선택) |
| 코드 예제 | c# if ((groundLayer.value & (1 << other.gameObject.layer)) != 0) { Debug.Log("Ground 레이어 오브젝트!"); } | c# if (other.CompareTag("Enemy")) { Debug.Log("적을 감지!"); } |
| 여러 개 동시 설정 가능? | ✅ 가능 (비트 연산으로 다중 선택) | ❌ 불가능 (오브젝트당 하나의 태그만 가능) |