티스토리 뷰

※ 금일은 간단한 내용으로 작성할 예정입니다.

 

일전에 물체 판별을 정리하면서 레이어마스크에 대해서 설명한 적이 있다.

[참고 URL: https://lsu0503.tistory.com/115]

 

해당 문서에서는 LayerMask를 조건문에서 어떻게 사용하는지만 다뤘었기에 :LayerMask는 인스펙터에서 설정하는 것을 기준으로 설명했었는데, 프로젝트를 진행하다 보면 LayerMask를 인스펙터가 아닌 스크립트 상에서 수정해야 하는 일이 발생한다.

그런 경우에 어떻게 사용해야 하는 지를 정리해 보자.


LayerMask는 32bit 자료형이다.

Layer는 최대 32개 까지 설정이 가능하며, Layer 자체는 자연수로 구성되어 저장된다.

그리고 LayerMask는 이 32개 Layer에 대한 판정 여부를 지정하는 32개의 bool값, 즉 32bit의 bit 자료형으로 구성된다.

 

여기서 주목할 것은 Layer는 자연수, LayerMask는 bit 자료형이라는 것이다.

그럼 이제 LayerMask를 설정하는 방법을 정리해 보자.


LayerMask.NameToLayer(string)

string값에 해당하는 레이어의 번호를 반환하는 함수. 이를 이용해서 원하는 Layer의 번호를 가져온 수 있다.

[또한, 반대로 LayerMask.LayerToName(layer)을 이용해서 Layer의 이름을 가져오는 것도 가능하다.]

 

다만, 이것을 그대로 LayerMask에 할당했다가는 낭패보기 딱 좋다.

왜냐면, 이 함수의 반환값은 자연수(int)이기 때문.

위에서 언급했듯이, LayerMask는 32bit의 '비트 변수'다.

즉, 6을 할당하면 110이, 10를 할당하면 1010이 되어버린다.

이런 상황을 피하기 위해서 익혀야하는 것이 bit연산 되시겠다.


비트 연산

일단 간단하게, 어떤 것이 있는 지만 나열해 보자.

  • << x [x비트 왼쪽(상향)이동]
  • >> x [x비트 오른쪽(하향)이동]
  • |       [or. 합집합]
  • &     [and. 교집합]
  • ~      [not. 보수 연산자 = bit값 반전]
  • ^      [XOR. 배타적 OR = or에 and 빼기]

기본적인 연산자들은 이렇게 정리할 수 있다.

[참고 URL: https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/operators/bitwise-and-shift-operators]

 

자, 그럼 이걸 가지고 LayerMask를 스크립트에서 설정하는 방법을 정리 해 보자.

  • 상술한 NameToLayer는 1 << LayerMask.NameToLayer(string)를 이용해서 해당 레이어를 지정할 수 있다.
  • ~과 &를 조합하면 원하는 Layer를 LayerMask에서 지정 해제할 수도 있다.
  • 반대로 | 를 이용하면 복수 레이어를 지정하는 것도 가능하다.

여담으로, LayeMask.NameToLayer(string)은 가능하면 캐싱해서 사용하자.

string값은 늘 그렇지만, 오타 나기가 매우 쉬운데 오류로 검출되지가 않아서 오류를 찾아내기가 난감한 터라...

아니면 아예 enum을 이용해서 Layer를 사전에 정리를 해 놓는 것도 방법일 수 있다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함