Version: 5.3 (switch to 5.4b)
Optimizing Shader Load Time
Определение столкновений с учётом слоёв.

Слои

Слои (Layers) в основном используются камерами (Cameras) для рендера частей сцены и источниками света (Lights) для освещения частей сцены. Но слои можно использовать и для избирательного игнорирования коллайдеров при рейкастинге, либо для определения столкновений.

Создание слоёв

Первый шаг - создать новый слой, который в последствии можно будет назначить GameObject’у. Для создания нового слоя, откройте меню Edit и выберите там пункт Project Settings->Tags.

На изображении ниже мы создаём новый слой в пустом слоте User Layer 8.

Назначение слоёв

Теперь, когда вы создали новый слой, его следует назначить одному из игровых объектов.

В менеджере тэгов (tag manager) мы создали слой Player с порядковым индексом 8.

Отрисовка только части сцены в помощью culling mask функции камеры

Вы можете избирательно отрисовывать объекты, находящиеся в определённом слое с помощью culling mask камеры (эта функция позволяет выбирать отображаемые камерой слои). Для этого выберите камеру, которая должна избирательно отрисовывать объекты.

И измените свойство culling mask с помощью включения или отключения слоёв в выпадающем меню.

Избирательный кастинг лучей

Вы можете кастить лучи, игнорируя коллайдеры на определённых слоях. Например, вы можете пожелать выпустить луч только в слое с главным персонажем, игнорируя при этом все остальные коллайдеры.

Метод Physics.Raycast принимает битовую маску, в которой каждый бит определяет - будет ли игнорироваться слой, или нет. Мы будем сталкивать луч со всеми коллайдерами, если в layerMask включены все биты. Если layerMask = 0, то луч никогда не столкнётся ни с одним из коллайдеров.

// JavaScript example.

// bit shift the index of the layer to get a bit mask
var layerMask = 1 << 8;
// Does the ray intersect any objects which are in the player layer.
if (Physics.Raycast (transform.position, Vector3.forward, Mathf.Infinity, layerMask))
    print ("The ray hit the player");


// C# example.

int layerMask = 1 << 8;
        
// Does the ray intersect any objects which are in the player layer.
if (Physics.Raycast(transform.position, Vector3.forward, Mathf.Infinity, layerMask))
    Debug.Log("The ray hit the player");


Тем не менее, в реальном мире в обычно требуется обратное. Мы желаем выпустить луч для столкновения со всеми коллайдерами, кроме тех, что находятся в слое Player.

// JavaScript example.
function Update () {
  // Bit shift the index of the layer (8) to get a bit mask
  var layerMask = 1 << 8;
  // This would cast rays only against colliders in layer 8.
  // But instead we want to collide against everything except layer 8. The ~ operator does this, it inverts a bitmask.
  layerMask = ~layerMask;

  var hit : RaycastHit;
  // Does the ray intersect any objects excluding the player layer
  if (Physics.Raycast (transform.position, transform.TransformDirection (Vector3.forward), hit, Mathf.Infinity, layerMask)) {
    Debug.DrawRay (transform.position, transform.TransformDirection (Vector3.forward) * hit.distance, Color.yellow);
    print ("Did Hit");
  } else {
    Debug.DrawRay (transform.position, transform.TransformDirection (Vector3.forward) *1000, Color.white);
    print ("Did not Hit");
  }
}


// C# example.
void Update () {
    // Bit shift the index of the layer (8) to get a bit mask
    int layerMask = 1 << 8;
        
    // This would cast rays only against colliders in layer 8.
    // But instead we want to collide against everything except layer 8. The ~ operator does this, it inverts a bitmask.
    layerMask = ~layerMask;
    
    RaycastHit hit;
    // Does the ray intersect any objects excluding the player layer
    if (Physics.Raycast(transform.position, transform.TransformDirection (Vector3.forward), out hit, Mathf.Infinity, layerMask)) {
        Debug.DrawRay(transform.position, transform.TransformDirection (Vector3.forward) * hit.distance, Color.yellow);
        Debug.Log("Did Hit");
    } else {
        Debug.DrawRay(transform.position, transform.TransformDirection (Vector3.forward) *1000, Color.white);
        Debug.Log("Did not Hit");
    }
}

Если вы не передаёте layerMask в метод Raycast, то будут игнорироваться только те коллайдеры, что находятся на слое IgnoreRaycast. Это самый простой способ игнорировать некоторые коллайдеры при рейкастинге.

Optimizing Shader Load Time
Определение столкновений с учётом слоёв.