본문 바로가기

C#/게임 제작 + TIL

비트 마스크 - LayerMask

비트 마스크에 대한 설명은 내용이 길어질 수 있으니 간단하게 정리된 링크만 남기고 유니티에서의 설명부터 하겠다.

https://docs.unity3d.com/Packages/com.unity.mathematics@1.2/api/Unity.Mathematics.math.bitmask.html

 

Method bitmask | Mathematics | 1.2.6

Method bitmask bitmask(bool4) Returns a bitmask representation of a bool4. Storing one 1 bit per component in LSB order, from lower to higher bits (so 4 bits in total). The component x is stored at bit 0, The component y is stored at bit 1, The component z

docs.unity3d.com

 

 

먼저 유니티에서는 Layer를 비트 마스크를 통해 표현하는데 이렇게 사용하는 이유는

  1. 효율적인 연산 : 비트 연산은 CPU에서 매우 빠르게 처리된다.
  2. 메모리 절약 :  0 과 1을 사용해 특정 상태를 나타내기에 32비트 정수 하나로 최대 32개의 상태를 나타낼 수 있다.
  3. 유연성 : 여러 레이어를 동시에 처리가 가능하다.

   ㄴ 여기서의 동시에 처리가 가능하다는 말은 논리 연산자에서의 표현법이 더 간략하다는 뜻이다.

int layerMask = LayerMask.GetMask("Layer1", "Layer2");
if ((layerMask & targetLayer) != 0) {
    // Layer1 또는 Layer2에 속하는 경우
}

 

 


 

그래서 왜 갑자기 비트 마스크와 Layer에 대한 말이 나왔냐 하면, 앞서 제작하던 맵 청크 자동 생성에서 Layer에 레이캐스팅을 통한 판정을 하기 위해 LayerMask를 사용하던 중, 디버깅을 위해 LayerMask의 값을 보고 생긴 궁금증 때문이었다.

int layerMask; // 청크 레이어 마스크.

private void Awake()
{
    layerMask = LayerMask.GetMask("Chunk");// 청크 레이어 마스크 == 6번 레이어.
    sceneController.StartGame += SetChunkList;
}

private void Update()
{
    Ray ray = new Ray(chunkCheckPoint.position, chunkCheckPoint.up);
    RaycastHit hit;

    if(!Physics.Raycast(ray, out hit, 20, layerMask) && sceneController.isGameStart)// 청크 생성 위치에 청크가 없다면
    {
        ChunkPlace();
    }
}

 

이런 식으로 LayerMask를 사용하고 있었는데 청크 생성과 관련한 오류 때문에 값을 보던 중 6번 레이어에 저장한

Chunk의 layerMask 변수 값이 64가 나오는 것을 발견하고 흥미가 생겨 여러 정보를 찾게 되었다.

 


 

 

 

 

이렇게 저장되는 이유는 비트 마스크를 기반으로 설정된 LayerMask는 0과 1로 이루어진 비트 마스크이고, 따라서 6번 레이어는 2^6  = 64의 값을 가지게 된다는 것이다.