개념공부/자투리 지식

Unity Layer, LayerMask, 비트 연산

Cadi 2025. 7. 9. 01:36

 

 

목차

     

     

     

    01. Unity Layer란 ? 

     

    Layer는 게임 오브젝트들을 그룹화하기 위한 기능으로, 주로 아래 세 가지 용도로 사용된다.

    • 카메라 렌더링 : Culling Mask를 통해 카메라가 어떤 오브젝트를 렌더링할지 결정한다.
    • Physics : 오브젝트 간 충돌 여부를 결정한다 (Layer Collision Matrix).
    • Raycast : 특정 레이어만 검사할 수 있도록 설정한다.

    Unity에서 Layer는 최대 32개까지 존재하며, 이 중 기본적으로 8개(0 ~ 7)는 예약되어 있다.

     

     

    02. LayerMask란 ? 

     

    LayerMask는 여러 Layer를 동시에 묶어 32비트 정수(Int32) 값으로 표현되는 비트 플래그(비트 마스크) 이다.

    예를 들어, Layer 3(Ground)를 LayerMask 값으로 변환하려면 다음과 같이 비트 연산을 사용한다.

    int mask = 1 << 3;

     

    Unity에서는 인스펙터에서 LayerMask를 선택하면, 내부적으로 이 값이 비트 플래그 형태로 저장된다.

     

    예)

    • Layer 0 → 0000…0001
    • Layer 1 → 0000…0010
    • Layer 2 → 0000…0100

    Layer 0과 2를 선택하면 → 0000…0101 (십진수 5)

     

    결국 LayerMask는 Int값이기 때문에 저장, 비교, 연산 모두 Int로 처리할 수도 있다.

     

    03. 비트 연산 (bitwise operation)

     

    컴퓨터는 모든 데이터를 0과 1로 저장한다. 이 0 또는 1 하나를 비트(bit) 라고 부른다.

    Unity에서는 비트 연산을 활용해 레이어나 LayerMask 등을 효율적으로 다룰 수 있다.
    비트 연산은 빠르며, 하나의 숫자로 여러 상태를 표현할 수 있어 메모리를 절약하고,

    여러 상태를 손쉽게 바꾸거나 비교할 수 있다는 장점이 있다.

     

    비트 연산의 종류

     

      1. AND 연산 ( & )
         
        두 비트가 모두 1일 때만 1이 된다.
        0101 & 0011 → 0001

        특정 비트가 켜져 있는지 검사하거나 LayerMask 포함 여부 검사에 활용한다.
         
      2. OR 연산 ( | ) 

        두 비트 중 하나라도 1이면 1이 된다.
        0101 | 0011 → 0111

        여러 비트를 켜거나, 여러 Layer를 하나의 Mask로 합치는 경우에 사용한다.

      3. XOR 연산 ( ^ ) 

        두 비트가 다를 때만 1이 된다.
        0101 ^ 0011 → 0110


      4. NOT 연산 ( ~ )

        비트를 반전 (0→1, 1→0) 시킨다.
        ~0101 → 1010

        음수 표현 때문에 주의가 필요하다.

         
      5. Shift 연산 ( << , >> )

        비트를 왼쪽 혹은 오른쪽으로 밀어낸다

        0000 0001 << 2 → 0000 0100
        0000 0100 >> 2 → 0000 0001
        
        
        int layer3 = 1 << 3; // Layer 3만 선택


        특정 레이어만 선택할 때에 사용한다. 

              

     

     

    04. Unity 사용 예시

     

    1. 여러 레이어를 하나의 Mask에 추가할 때 
      int maskA = 1 << 3;
      int maskB = 1 << 5;
      int combined = maskA | maskB;
      // combined: Layer 3과 Layer 5가 모두 포함


    2. Layer의 포함 여부를 검사할 때 
      int layer = 5;
      int mask = (1 << 3) | (1 << 5);
      
      bool included = (mask & (1 << layer)) != 0;


    3. Layer를 제외할 때 
      int excludeLayer = 4;
      int mask = ~(1 << excludeLayer);



    Raycast에서 특정 레이어만 검사하는 기능을 활용할 수도 있다.

    LayerMask mask = LayerMask.GetMask("Enemy", "Obstacle");
    
    if (Physics.Raycast(ray, out hit, 100f, mask))
    {
        Debug.Log("Hit Layered Object!");
    }

     

    GetMask( | 연산과 비슷 )으로 Enemy와 Obstacle이란 이름을 지닌 Layer를 포함하는 LayerMask를 생성한 뒤,

     Enemy와 Obstacle만 검사하는 Raycast를 발사하는 방식이다. 

     

     

    또 반대로, 특정 Layer만을 제외할 수 있다 .

    int exclude = LayerMask.NameToLayer("ClosedRoom");
    int mask = ~(1 << exclude);
    
    if (Physics.Raycast(ray, out hit, 100f, mask))
    {
        Debug.Log("Hit excluding ClosedRoom Layer!");
    }

     

    혹은 Layer를 검사해 LayerMask가 특정 Layer를 포함하는지 검사할 수 있다. 

    int target = (1 << 1) | (1 << 2);
    bool overlap = (mask & target) != 0;

     

    이 결과에서 True, 즉 결과값이 0이 아니라면 특정 레이어를 포함한다는 것이다. 

     

     

    참고 : 

    https://docs.unity3d.com/kr/560/Manual/Layers.html

     

    레이어 - Unity 매뉴얼

    레이어(Layers) 는 카메라 가 씬의 일부만 렌더링하고 광원 이 씬의 일부만 비추기 위해 가장 많이 사용됩니다. 그 외에도 콜라이더를 선별적으로 무시하거나 충돌을 생성하기 위해 레이캐스팅에

    docs.unity3d.com