Unity 레이어 마스크가 비트 시프 팅을 사용해야하는 이유는 무엇입니까? 레이어 마스크가 작동하지 않는

지상 충돌 코드에 대한 레이어 마스크가 작동하지 않는 이유를 마침내 알아 냈습니다. 내가 사용하던 NameToLayer()내가 필요한 레이어를 얻을 수 있지만, 레이어 마스크는 비트 실제로 레이어 마스크 값을 설정하는 이동 사용합니다. 이것은 매우 드문 일이며 이것이 코드에서 처리되지 않는 이유는 없습니다. 왜 이런 코드를 사용해야합니까?

mask = 1 << LayerMask.NameToLayer("Default");

이럴 때 :

mask = LayerMask.NameToLayer("Default");

더 직관적으로 이해하고 나머지 Unity API와 유사하게 작동합니까?



답변

이것은 매우 성능이 좋습니다. 이것으로 충분합니다. 명백한 예가 10만큼 느리게 문자열을 비교하는 것입니다. 물리 계산은 매우 최적화되어야하므로 진행 상황을 알고있는 사람이 이런 식으로 작성하는 것이 좋습니다.

따라서 명백한 후속 질문은-왜 이것이 변환 및 비트 시프 팅을 처리하기 위해 도우미 메소드에 포함되어 있지 않은가입니다. 나는 아무도 그것을 실제로 얻지 못했다고 생각한다. 나는 내 자신의 멋진 도우미 유틸리티를 롤업했으며 이것이 일반적인 관행이다.


답변

비트 이동을 사용하면 한 물리 연산에서 여러 레이어를 고려할 수 있습니다.

 Physics.Raycast(ray, out hitInfo, Mathf.Infinity, layerMask )

비트 시프 팅이 없으면 한 레이어에서 하나의 레이어에만 레이 캐스트 할 수 있습니다. 비트 이동을 사용하면 여러 특정 레이어에서 레이 캐스트 할 수 있습니다.

layerMask = (1 << LayerMask.NameToLayer("MyLayer1")) | (1 << LayerMask.NameToLayer("MyLayer2")) ;

특정 레이어를 제외한 모든 레이어에서 레이 캐스트 할 수도 있습니다.

layerMask = (1 << LayerMask.NameToLayer("MyLayer1")) | (1 << LayerMask.NameToLayer("MyLayer2")) ;
layerMask = ~layerMask;

Unity“Layer manager” 를 보면 레이어는 단순한 1 차원 배열의 인덱스로 볼 수 있습니다 .


편집 : 전에는 본 적이 없지만 LayerMask클래스에는 레이어 이름이 지정된 “계산 된”레이어 마스크를 가져 오는 유틸리티 함수가 있습니다.

Debug.Log( LayerMask.GetMask("UserLayerA", "UserLayerB") ) ;

가정 UserLayerAUserLayerB제 10 및 제 열한번째 층이다. 이것의 사용자 레이어 값은 10과 11입니다. 레이어 마스크 값을 얻기 위해 이름을 GetMask로 전달할 수 있습니다. 인수는 이름 목록이거나 이름을 저장하는 문자열 배열 일 수 있습니다. 이 경우 반환 값은 2 ^ 10 + 2 ^ 11 = 3072입니다.

설명서 링크 : https://docs.unity3d.com/ScriptReference/LayerMask.GetMask.html


답변