Unity 6.3
0 онлайн 91 гостей 3 в системе
Вход
GameObjects Шаг 34 из 56

Использование слоев в Unity

Вы можете использовать слои для оптимизации вашего проекта и рабочего процесса. Обычно слои используются для следующих целей:

  • Слоевое отображение
  • Коллизия слоев

Используйте маску Camera с слоями

Вы можете рендировать только объекты в определенном слое или выборе слоев, если используете маску выделения Camera. Чтобы изменить маску выделения, выберите камеру, которую вы хотите использовать, и выберите Маска для уборки в раскрывающемся списке в окне Inspector. Если вы снимете флажок слоя, он не будет рендирован в сцене.

Примечание: Элементы UI и дочерние элементы экранного пространства являются исключениями из этого правила и отображаются независимо.

Лучевая отливка со слоями

Вы можете использовать слои, чтобы указать, с каким GameObjects может пересекаться отображение луча. Чтобы отображение луча игнорировало GameObject, вы можете назначить его слою Ignore Raycast или передать вызов LayerMask в вызов отображения луча API.

Если вы не передаёте вызов LayerMask в вызов raycast API, Unity использует Physics.DefaultRaycastLayers, который соответствует каждому слою, кроме Ignore Raycast.

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

Например, если вы хотите отобразить луч на слое 8, смотрите пример кода ниже:

int layerMask = 1 << 8;

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

Затем вы можете сделать обратное, так что луч столкнется со всеми слоями, кроме слоя 8.

void Update ()
{
    // Bit shift the index of the layer (8) to get a bit mask
    int layerMask = 1 << 8;

    // This casts rays only against colliders in layer 8.
    // But to collide against everything except layer 8, use the ~ operator because it inverts a bitmask.
    layerMask = ~layerMask;

    RaycastHit hit;
    // Does the ray intersect any objects excluding layer 8.
    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 слой.

Дополнительные ресурсы