LayerMask란 무엇인가?

  1. LayerMask의 정의:

    • LayerMask는 Unity에서 특정 레이어(Layer)에 속한 오브젝트들만 대상으로 물리 연산(Raycast, Culling 등)을 수행하기 위한 기능입니다.
    • 레이어는 게임 오브젝트의 물리적 처리카메라 렌더링 등에 영향을 줄 수 있습니다.
    • LayerMask는 32비트의 정수(int)로 표현되며, 각 비트가 특정 레이어를 나타냅니다.
  2. LayerMask의 역할:

    • Raycasting 최적화: 특정 레이어의 오브젝트만 대상으로 Raycasting을 수행하여 연산 부하를 줄입니다.
    • Culling Mask: 특정 레이어의 오브젝트만 카메라에 렌더링되도록 설정해 성능을 최적화합니다.

LayerMask의 비트 플래그 구조

  1. 32비트 정수 구조:

    • LayerMask는 32개의 비트로 구성되며, 각 비트는 특정 레이어를 나타냅니다.
    • 예:
      • 8번 레이어: 00000000 00000000 00000001 00000000 (2^8 = 256)
      • 9번 레이어: 00000000 00000000 00000010 00000000 (2^9 = 512)
  2. 비트 연산 활용:

    • 특정 레이어를 선택하려면 비트를 왼쪽으로 이동(Shift)시킵니다.
      int mask = (1 << 8); // 8번 레이어 선택
    • 여러 레이어 결합: |(OR 연산)을 사용해 여러 레이어를 조합합니다.
      int mask = (1 << 8) | (1 << 9); // 8번과 9번 레이어 결합
  3. 비트 플래그 예제:

    int mask = (1 << 8) | (1 << 9); 
    // 결과: 00000000 00000000 00000011 00000000 (십진수: 768)

LayerMask를 사용하는 주요 이유

  1. 성능 최적화:

    • Raycasting은 부하가 큰 연산이므로, 모든 오브젝트를 대상으로 연산하지 않고 특정 레이어만 대상으로 처리하여 성능을 개선합니다.
  2. Mesh Collider와의 연산 감소:

    • 복잡한 Mesh Collider를 사용하는 오브젝트에 대해 Raycast를 수행하면 계산량이 급증하므로, LayerMask로 필요한 오브젝트만 처리합니다.
  3. 렌더링 최적화:

    • 카메라의 Culling Mask를 설정하여 특정 레이어에 속한 오브젝트만 렌더링함으로써, 렌더링 비용을 줄입니다.

LayerMask와 Raycasting

1. 특정 레이어만 Raycasting 하기

int mask = (1 << 8); // 8번 레이어
RaycastHit hit;

if (Physics.Raycast(ray, out hit, 100.0f, mask))
{
    Debug.Log($"Raycast 충돌 @ {hit.collider.gameObject.name}");
}

코드 분석:
1. (1 << 8)

  • 8번 레이어를 선택하기 위해 비트를 왼쪽으로 8번 이동.
  • 결과: 00000000 00000000 00000001 00000000 (256).
  1. Physics.Raycast의 네 번째 인자:
    • mask는 Raycasting의 대상 레이어를 지정합니다.
    • 8번 레이어를 가진 오브젝트에 대해서만 Raycast가 수행됩니다.

2. 여러 레이어 결합하여 Raycasting 하기

int mask = (1 << 8) | (1 << 9); // 8번과 9번 레이어
RaycastHit hit;

if (Physics.Raycast(ray, out hit, 100.0f, mask))
{
    Debug.Log($"Raycast 충돌 @ {hit.collider.gameObject.name}");
}

코드 분석:
1. (1 << 8) | (1 << 9)

  • OR 연산을 사용해 8번과 9번 레이어를 결합.
  • 결과: 00000000 00000000 00000011 00000000 (768).
  1. 결과:
    • 8번 또는 9번 레이어를 가진 오브젝트에 대해서만 Raycast가 수행됩니다.

3. 직관적인 LayerMask 사용

LayerMask mask = LayerMask.GetMask("Monster", "Wall"); // "Monster"와 "Wall" 레이어
RaycastHit hit;

if (Physics.Raycast(ray, out hit, 100.0f, mask))
{
    Debug.Log($"Raycast 충돌 @ {hit.collider.gameObject.name}");
}

코드 분석:
1. LayerMask.GetMask

  • 레이어 이름을 문자열로 전달하여 해당 레이어의 비트를 자동으로 반환합니다.
  • "Monster" 레이어와 "Wall" 레이어를 선택.
  1. 결과:
    • 8번과 9번 레이어에 해당하는 오브젝트만 Raycast의 대상이 됩니다.

Tag와의 비교

특징LayerMaskTag
구조32비트 비트 플래그문자열 기반
구분 가능 개수최대 32개 레이어제한 없음
목적물리 연산 및 렌더링 최적화오브젝트 그룹화
활용 예Raycasting, Culling Mask특정 오브젝트 검색 (e.g., FindWithTag)

LayerMask 사용 사례

1. Monster 레이어만 Raycasting

int mask = (1 << 6); // Monster 레이어 (6번)
RaycastHit hit;

if (Physics.Raycast(ray, out hit, 100.0f, mask))
{
    Debug.Log($"Raycast @ {hit.collider.gameObject.name}");
}

2. Monster와 Wall 레이어만 Raycasting

LayerMask mask = LayerMask.GetMask("Monster") | LayerMask.GetMask("Wall");
RaycastHit hit;

if (Physics.Raycast(ray, out hit, 100.0f, mask))
{
    Debug.Log($"Raycast @ {hit.collider.gameObject.name}");
}

3. 직관적인 코드와 비트 연산 비교

// 직관적인 코드
LayerMask mask = LayerMask.GetMask("Monster", "Wall");

// 비트 연산을 사용한 코드
int mask = (1 << 6) | (1 << 7);

LayerMask와 최적화의 중요성

  1. Raycasting 최적화:

    • 필요하지 않은 오브젝트를 Raycast 대상에서 제외하여 연산량 감소.
    • 복잡한 Mesh Collider를 사용하는 오브젝트를 제외하여 성능 개선.
  2. Culling Mask:

    • 카메라에 렌더링할 오브젝트를 특정 레이어로 제한하여 렌더링 부하를 줄임.

profile
李家네_공부방

0개의 댓글