개념공부/자투리 지식

Unity에서 비트 연산을 사용한 레이어 감사 방법

Cadi 2025. 4. 28. 20:48

 

비트 마스크 기본 개념

 

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