Клик по объекту или UI

Когда элементы интерфейса (UI) находятся поверх объекта, и нам нужно знать об этом при клике , используем:

EventSystem.current.IsPointerOverGameObject()

Например:

// если кликнули правой кнопкой мыши
if (Input.GetMouseButtonDown(0) && !EventSystem.current.IsPointerOverGameObject()) 
{
  // а попали по элементу UI
}
// если ткнули пальцем
if (Input.touchCount > 0) 
{
  Touch touch = Input.GetTouch(0);
  if (touch.phase == TouchPhase.Began && !EventSystem.current.IsPointerOverGameObject(touch.fingerId)) 
  {
  // а попали по элементу UI
  }
}

 

Маска слоя для Raycast

Функция 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