Unity에서는 LayerMask를 사용하여 Raycast를 할 때, 레이어를 직접 입력하여 사용할 수 있다. 하지만 이 방법은 레이어 번호가 변경될 경우 코드를 일일이 수정해야 하기 때문에 비효율적일 수 있다. 이번 글에서는 LayerMask를 사용할 때 레이어 번호를 직접 입력하는 방법과 함께, 레이어 이름으로 레이어 번호를 알아오는 방법을 살펴보자.
레이어 번호로 레이어 마스크 값 구하기
레이어를 지정하기 위해 32bit 비트 마스크를 사용하고 있고, 레이어를 지정하기 위해서는 각 레이어 순서의 플래그가 켜져 있는 이진 값을 넘겨 줘야한다. 각 레이어를 구분하기 위해 32bit 비트 마스크를 사용한다. 레이어는 0부터 시작하며 31이 마지막 레이어 번호다. 레이어 마스크를 인자로 받는 Raycast 함수를 살펴 보면 int 타입을 요구하기 때문에 혹시 여러분 중에서 인스펙터의 레이어 번호를 인자로 넘기면 될 것이라고 생각하는 사람이 있을 수도 있다. 하지만 레이어 번호를 그대로 입력할 경우, 레이어 번호가 변경될 경우 코드를 일일이 수정해야 하기 때문에 비효율적일 수 있다.
예를 들어 9번 레이어를 선택하기 위해서는 0번째 레이어 마스크를 켜고 쉬프트 연산자(<<)를 이용해 왼쪽으로 9번 이동시켜 주면 된다.
if (Physics.Raycast(ray, 10, 1<<9)){// Layer 9 was hit!}
그러나, 만일 여러분이 9번 레이어를 선택하기 위해 9를 넘기게 되면 결과적으로 아래 그림과 같이 마스킹 되어 0번, 3번 레이어가 선택되게 될 수 있다.
그렇기 때문에 9번 레이어를 선택하기 위해서는 512를 넘겨 주어야 한다.
if (Physics.Raycast(ray, 10, 512)){// Layer 9 was hit!}
만일 9번과 4번 레이어를 동시에 선택하고 싶다면 아래와 같이 528을 넘겨야 한다.
if (Physics.Raycast(ray, 10, 528)){// Layer 9 or 4 was hit!}
LayerMask 값으로 레이어 이름 구하기
Unity에서는 LayerMask.NameToLayer 함수를 제공하여, 레이어의 문자열 이름으로 부터 레이어 번호를 얻을 수 있다.
예를 들어, 5번 레이어의 이름이 "UI"라고 가정한다면 아래와 같이 코드를 작성할 수 있다.
int layerNum = LayerMask.NameToLayer("UI");
Debug.Log(layerNum); // 5
하지만 레이어 마스크는 이진 데이터를 파라메터로 받기 때문에, 쉬프트 연산을 통해 해당 위치의 비트를 켜주어야 한다.
Ray ray = new Ray(transform.position, transform.forward);
int layerNum = LayerMask.NameToLayer("UI");
if (Physics.Raycast(ray, 10, 1<<layerNum)){Debug.Log("something else was hit");
}
레이어 이름으로 레이어 번호 구하기
레이어 이름으로 레이어 번호를 구하는 방법은, 다음과 같이 레이어 이름을 검색하여 해당 레이어의 번호를 가져오는 방식이다.
int layerNum = LayerMask.NameToLayer("UI");
그러나, 이 방식은 레이어의 이름을 일일이 검색하여 번호를 가져와야 하기 때문에 매우 번거로울 수 있다. 따라서, 아래와 같이 미리 정의한 Enum을 이용하여 레이어 번호를 가져오는 것이 좋다.
public enum LayerNum{
Default = 0,
TransparentFX = 1,
IgnoreRaycast = 2,
Water = 4,
UI = 5,
...
}
int layerNum = (int)LayerNum.UI;
위와 같이 Enum을 사용하면, 레이어 번호를 직접 입력하지 않아도 되기 때문에 코드를 유지보수하기에도 편리하다.
결론
이번 글에서는 LayerMask를 사용할 때 레이어 번호를 직접 입력하는 방법과, 레이어 이름으로 레이어 번호를 가져오는 방법을 살펴보았다. 레이어 번호를 직접 입력하는 방법은 레이어 번호가 변경될 경우 코드를 일일이 수정해야하는 불편함이 있지만, 레이어 이름으로 레이어 번호를 구하는 방법은 검색이나 수정이 간편하다는 장점이 있다. 따라서, 상황에 따라 적절히 사용하여 효율적인 코드를 작성하도록 하자.
'Unity' 카테고리의 다른 글
Unity Package-lock.json 파일이란 무엇인가? (0) | 2023.06.30 |
---|---|
Unity Animator의 Any State 기능이란? (0) | 2023.06.29 |
Unity : Ray, Raycast 및 RaycastHit (0) | 2023.06.22 |
Unity의 IL2CPP란? (0) | 2023.06.21 |
Unity의 OnApplicationQuit, OnDisable, OnDestroy 이벤트 함수의 차이점 (0) | 2023.05.20 |