티스토리 뷰
지금 당장은 터치와 오브젝트 간의 충돌 설정을 위해서 레이어마스크를 쓰고 있는데요...
콜라이더가 여러개일경우 아니면 오류 설정을위해서 레이어마스크를 사용해야 합니다.
레이어마스크는 비트 마스크로 마스킹을 하는데요.
근데 이게 제가 대충 사용법만 알고 있었지 뭔 원리인지 모르겠어서 한 번 이 포스트에 정리해보려 합니다.
위에 보이는 레이어 설정창을 보면 커스텀 레이어가 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을 넣으면 다 검사!
'개발일기 > 유니티3D' 카테고리의 다른 글
유니티 multidex 설정이 안되길래 확인해보니... (0) | 2020.09.14 |
---|---|
유니티에서 해당 안드로이드 단말기의 국가정보를 알고 싶을 때.. (0) | 2019.06.20 |
유니티에서 Spine 사용하기 스크립트편 (0) | 2019.05.23 |
Unite Seoul 2019 다녀옴 (0) | 2019.05.23 |
UGUI 드래그로 오브젝트 회전 (0) | 2019.05.07 |