Використання бітового зсуву дозволяє враховувати кілька шарів за одну фізичну операцію:
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, шари можна розглядати як показники простого одновимірного масиву .
EDIT: Я ніколи не бачив цього раніше, але LayerMask
клас має корисну функцію для отримання "обчисленої" маски шару з урахуванням назв шарів:
Debug.Log( LayerMask.GetMask("UserLayerA", "UserLayerB") ) ;
Припустимо, UserLayerA
і UserLayerB
це десятий та одинадцятий шари. Вони матимуть значення користувальницького шару 10 та 11. Для отримання значення їх маски шару їхні імена можна передати у GetMask. Аргументом може бути або список їх імен, або масив рядків, що зберігають їх імена. У цьому випадку значення повернення буде 2 ^ 10 + 2 ^ 11 = 3072.
Посилання на документацію: https://docs.unity3d.com/ScriptReference/LayerMask.GetMask.html