티스토리 뷰

 

지금 당장은 터치와 오브젝트 간의 충돌 설정을 위해서 레이어마스크를 쓰고 있는데요...

콜라이더가 여러개일경우 아니면 오류 설정을위해서 레이어마스크를 사용해야 합니다.

레이어마스크는 비트 마스크로 마스킹을 하는데요.

근데 이게 제가 대충 사용법만 알고 있었지 뭔 원리인지 모르겠어서 한 번 이 포스트에 정리해보려 합니다.

 

위에 보이는 레이어 설정창을 보면 커스텀 레이어가 8번부터 되어있는 걸 볼 수 있는데요.

이 숫자가 걍 보기 편하라고 있는 줄 알았는데 비트마스크의 역할을 하게 하더라고요.

그래서 LayerMask.GetMask("StageBtn"); 의 리턴값은 1024가 되는거죠 (2의 10승)

여기서 만약 레이어마스크에 UI레이어를 같이 검사하고 싶으면 2의 5승인 32를 더해서 1056이 되는 거군요.

 

그래서 만약 내가 5번과 10번 레이어를 쓰고 싶다!인경우

다음과 같이 되겠군요.

 

1 << 10 | 1 << 5

LayerMask.GetMask("StageBtn") | LayerMask.GetMask("UI");

이 두 라인이 사실은 같은 내용인데요.

 

비트연산이라 유니티하면서 자주쓰지는 않는 연산자가 두 개나 나오죠

왼쪽 시프트 연산자 << 와

논리 or 연산자인 | 입니다.

 

보통은 or 를 쓸 때 bool 값에서 || 로 or를 쓸 때가 많은데 비트연산시의 |도 비슷하지만 비트연산시에 사용한단것이 다릅니다. (&도 바찬가지임)

 

다음과 같은 이진수 정수 두개가 있으면

1001

1100

두 값을 | 연산을 하면

1101 이 됩니다. 둘 중에 하나라도 1이면 1로 해주는거죠.

 

이 원리를 따라서

각 레이어는 2의 레이어 번호승의 값을 갖고 있고 

2의 제곱들이기 때문에

비트 연산이 손쉽게 되겠죠

2의 5승은

100000 이고..

2의 10승은

10000000000 니까 두 개를 | 연산자를 하면

10000100000 의 값이 도출되겠죠. 

그리고 이 값은 1056입니다. 

 

그럼 <<  이 왼쪽 시프트 연산자는 왜 쓰는 것일까요?

사실 안 써도 할 순 있지만 표기의 편의성 때문에 쓴다고 생각하시면 됩니다.

 

위에 1 << 5 이렇게 썼는데요.

뭔소리냐면

000001 에서 1인 녀석을 왼쪽으로 5칸 움직이라는 거에요.

그럼 결과는?

100000이 되겠죠.

 

그리고 이 2진수의 비트는 32니까 2의5승이 딱 나오죠?

따라서 Mathf.Pow(2,5) 와 1 << 5 는 같은거네요.

근데 굳이 함수를 호출하는것보다 이렇게 비트 연산으로 하는 게 좀 더 편안하니까 쓰는 것 같아요.

 

따라서 이런 연산자가 나오더라도 당황하지 않기~

 

참고로 마스크가 0이면 아무것도 검사안함~

-1을 넣으면 다 검사!

댓글
최근에 올라온 글
Total
Today
Yesterday
TAG
more
«   2024/07   »
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 31