Korzystanie z przesunięcia bitowego pozwala uwzględnić wiele warstw w jednej operacji fizycznej:
Physics.Raycast(ray, out hitInfo, Mathf.Infinity, layerMask )
Bez przesuwania bitów, możesz raycastować w jednej warstwie i tylko w jednej. Podczas przesuwania bitów możesz raycast na wielu określonych warstwach:
layerMask = (1 << LayerMask.NameToLayer("MyLayer1")) | (1 << LayerMask.NameToLayer("MyLayer2")) ;
Możesz także raycastować na wszystkich warstwach oprócz określonych:
layerMask = (1 << LayerMask.NameToLayer("MyLayer1")) | (1 << LayerMask.NameToLayer("MyLayer2")) ;
layerMask = ~layerMask;
Jeśli spojrzysz na „Menedżera warstw” w Unity, warstwy mogą być postrzegane jako wskaźniki prostej tablicy jednowymiarowej .
EDYCJA: Nigdy wcześniej go nie widziałem, ale LayerMask
klasa ma funkcję użyteczną do uzyskania „obliczonej” maski warstwy, biorąc pod uwagę nazwy warstw:
Debug.Log( LayerMask.GetMask("UserLayerA", "UserLayerB") ) ;
Załóżmy UserLayerA
i UserLayerB
są dziesiątą i jedenastą warstwą. Będą miały wartości warstwy użytkownika 10 i 11. Aby uzyskać wartość maski warstwy, ich nazwy można przekazać do GetMask. Argumentem może być lista ich nazw lub tablica ciągów przechowujących ich nazwy. W takim przypadku zwracana wartość będzie wynosić 2 ^ 10 + 2 ^ 11 = 3072.
Link do dokumentacji: https://docs.unity3d.com/ScriptReference/LayerMask.GetMask.html