우선 이해안가시는 모든 부분에 대해 일일히 답변을 드릴 수는 없기 때문에 구글링을 열심히 하시고, 그래도 이해가 안가는게 있을 때만 질문을 하셔야 합니다. 질문주신 부분에서 구글에 검색할 키워드는 [비트마스크]이고 은근히 중요한 주제입니다. 우선 구글링을 통해 충분히 이해가 되었다는 가정하에, 답변을 드리면 다음과 같습니다.
1. 왜 _mask의 값을 쉬프트 연산자로 1을 왼쪽으로 9만큼(Define.Layer.Ground)옮기고 Monster일때는 1을 왼쪽으로 8만큼 옮기게 해서 _mask에 값을 할당을 하나요?
비트마스크이기 때문입니다. 어떤 숫자 value랑 _mask랑 AND를 하게 되면, 깨알같이 필요한 데이터만 추출됩니다.
value :
mask :
value & mask로 and 하면 value에서 8, 9 비트 값만 남기고 나머지는 다 0으로 날아감
2. _mask에 왜 하드코딩으로 값을 넣어주지 않고 쉬프트 연산자를 사용해서 정수값을 넣어주나요??
그냥 넣어도 됩니다. 단지 1 << 형식으로 넣어야 마스크를 만들어준다는게 더 이해하기 쉬울 뿐이죠.
3. 1 << (int)Define.Layer.Ground하게 되었을때 1을 왼쪽으로 9칸 보내면 0001 0000 0000 으로(2진수) 256이 되서? AddLayer의 9번과 안 맞는것 아닌가요...??? 음~ 질문이 잘 이해가 안갑니다. AddLayer의 9번과 안 맞는다는게 어떤 의미일까요?
4. 쉬프트연산을 사용하는것이 빠르다면 왜 빠른것인가요??
CPU에서 제공하는 가장 쉽고 단순한 명령어이기 때문입니다. 그리고 데이터 저장 방식도 훨씬 효율적으로 int 하나에 32개의 경우의 수를 담아넣을 수 있습니다.
1. 두개의 정수를 넣은 것이 아니구요. (int)Define.Layer.Ground | (int)Define.Layer.Monster 여기서 | 은 bitwise OR 연산입니다. 이런 식으로 1 <<8과 1<<9가 합쳐지게 됩니다. 결과적으로 768이라는 숫자를 넣은 것과 동일합니다.
2. Physics.Raycast 내부적으로 특정 물체의 Layer를 확인해서, 해당 Layer가 우리가 Bitmask로 켜둔 것인지를 확인하겠죠. 가령 Layer가 Monster (8)인 오브젝트가 있는데, 우리가 8번과 9번은 1으로 설정한 Bitmask를 넘겨줬으니 충돌이 인정되고 이런식입니다.