Функция Raycast использует в качестве одного из параметров int layerMask — маску слоя. Поскольку layerMask имеет тип int, она состоит из 32 битов:
0000 0000 0000 0000 0000 0000 0000 0000
где каждый бит (считая справа-налево) — номер слоя. (Первый бит справа — это слой 0 — «Default», второй бит — слой 1 — «TransparentFX», третий — слой 2 — «Ignore Raycast» и т.д.)
Если мы хотим использовать слой номер n, нам нужно установить соответствующий бит в единицу. Например нам нужно использовать слой 1 (TransparentFX), это значит, что второй бит справа должен быть единицей (в десятеричном исчислении — это число 2). Второй — потому что нумерация ведётся с нуля, 0, 1, 2 и т.д.
0000 0000 0000 0000 0000 0000 0000 0010
Если нужно использовать слой 2 (Ignore Raycast), это значит, что третий бит справа должен быть единицей (в десятеричном исчислении — это число 4)
0000 0000 0000 0000 0000 0000 0000 0100
Установить нужный бит можно несколькими способами:
int layerMask = 4;
// просто присваиваем нужно значение
int layerMask = LayerMask.NameToLayer(«Ignore Raycast»);
// находим числовое значение слоя с помощью его имени
int layerMask = 1 << 2;
// побитовый сдвиг
Рассмотрим последний способ.
Единица (int) — это
0000 0000 0000 0000 0000 0000 0000 0001
Побитовый сдвиг единицы 1 << n (грубо говоря) «сдвигает» самый правый бит равный 1 на n позиций влево. Таким образом,
int layerMask = 1 << 1; // 0000 0000 0000 0000 0000 0000 0000 0010
int layerMask = 1 << 2; // 0000 0000 0000 0000 0000 0000 0000 0100
int layerMask = 1 << 3; // 0000 0000 0000 0000 0000 0000 0000 1000
и т.д.
Над масками можно совершать битовые операции. Например, нам нужна маска, которая бы включала в себя 4 и 8 слои.
int layer4 = 1 << 4; // 0000 0000 0000 0000 0000 0000 0001 0000 int layer8 = 1 << 8; // 0000 0000 0000 0000 0000 0001 0000 0000 int layerMask = layer4 | layer8; // 0000 0000 0000 0000 0000 0001 0001 0000
или просто
int layerMask = 1 << 4 | 1 << 8