비트 마스크 기본 개념
Unity Layer 기본 개념
Unity에서는 Layer가 0 ~ 31번까지 총 32개가 있다.
Layer는 결국 정수(int) 값이고, 각 비트 자리수가 레이어 1개를 의미한다.
- 레이어 0번 → 0000...0001 (2진수)
- 레이어 1번 → 0000...0010
- 레이어 2번 → 0000...0100
- 레이어 3번 → 0000...1000
비트 연산자
비트 연산은 C, C++, C#, Java, Python 등 대부분의 프로그래밍 언어에서 기본으로 제공하는 공통 기능이다.
연산자들은 다음과 같다.
| 연산자 | 이름 | 설명 | 예시 |
| << | 비트 왼쪽 이동 (Shift Left) | 비트를 왼쪽으로 n칸 이동. 값이 2ⁿ 배가 됨. | 1 << 3 → 8 |
| >> | 비트 오른쪽 이동 (Shift Right) | 비트를 오른쪽으로 n칸 이동. 값이 2ⁿ로 나눠짐. | 8 >> 2 → 2 |
| & | 비트 AND | 둘 다 1일 때만 1. (공통 비트 추출) | 1100 & 1010 = 1000 |
| | | 비트 OR | 둘 중 하나라도 1이면 1. (비트 통합) | 1000 | 0001 = 1001 |
| ^ | 비트 XOR (exclusive or) | 둘이 다르면 1. 같으면 0. | 1100 ^ 1010 = 0110 |
| ~ | 비트 NOT (반전) | 비트를 모두 반전시킴 (1→0, 0→1) | ~1100 = 0011 (32bit 기준 주의) |
유니티에서의 응용
<< 연산을 사용하면, 1 혹은 0을 특정 위치까지 밀 수 있다.
int layerMask = 1 << 5; // 5번 레이어만 선택
1을 5칸 밀어 5번 레이어를 선택한다는 의미이다.
0000...0010 0000 (2진수) -> 32 (10진수)
비트 연산을 사용해 유니티에서 다양한 레이어를 검사할 수 있다.
int itemLayer = 1 << 8; // 아이템 레이어 8번
int interactiveObjectLayer = 1 << 9; // 인터랙티브 오브젝트 레이어 9번
int combinedLayer = itemLayer | interactiveObjectLayer;
다만, 이렇게 검사를 하고 레이캐스트를 쏴서 맞은 (Hit) 것의 레이어를 확인하고 싶다면 다음과 같은 과정을 거쳐야 한다.
int hitLayer = hitObject.layer;
// 아이템 레이어와 비교
if ((itemLayer & (1 << hitLayer)) != 0)
{
// 이 오브젝트는 아이템이다
}
// 인터랙티브 오브젝트 레이어와 비교
else if ((interactiveObjectLayer & (1 << hitLayer)) != 0)
{
// 이 오브젝트는 인터랙티브 오브젝트다
}
LayerMask
유니티 내부에서는 LayerMask라는 타입을 제공해서, 비트마스크를 조금 더 편하게 사용할 수 있다.
LayerMask는 '선택한 레이어들의 집합'을 표현하는 것으로 다양한 레이어들을 선택해서 표현할 수 있다.
예를 들어 , public LayerMask targetLayer; 으로 선언하고 인스펙터에서 직접 편집 가능하다.
[SerializeField] LayerMask detectableLayers;
RaycastHit hit;
if (Physics.Raycast(ray, out hit, detectRange, detectableLayers))
{
// hit
}
내부적으로는 그냥 int로 저장된다.
주의할 점은, 1 << 32 이상의 연산은 유효하지 않으며 예기치 않은 동작(에러 발생, 값 무시 등)이 일어날 수 있다.
'개념공부 > 자투리 지식' 카테고리의 다른 글
| C# Switch 정리 (0) | 2025.09.03 |
|---|---|
| IComparable<T> (2) | 2025.07.23 |
| Unity Layer, LayerMask, 비트 연산 (0) | 2025.07.09 |
| 유니티에서의 null ( feat. fake null ) (3) | 2025.07.08 |