Использование сдвига битов позволяет учитывать несколько слоев в одной физической операции:
Physics.Raycast(ray, out hitInfo, Mathf.Infinity, layerMask )
Без смещения битов вам будет разрешено осуществлять радиопередачу в одном слое и только в одном. В то время как со сдвигом битов, вы можете raycast в нескольких конкретных слоях:
layerMask = (1 << LayerMask.NameToLayer("MyLayer1")) | (1 << LayerMask.NameToLayer("MyLayer2")) ;
Вы также можете выполнять Raycast на всех слоях, кроме определенных:
layerMask = (1 << LayerMask.NameToLayer("MyLayer1")) | (1 << LayerMask.NameToLayer("MyLayer2")) ;
layerMask = ~layerMask;
Если вы посмотрите на «Диспетчер слоев» в Unity, слои можно рассматривать как индексы простого одномерного массива .
РЕДАКТИРОВАТЬ: я никогда не видел его раньше, но у 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