Использование слоев в 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 слой.
Дополнительные ресурсы
- Метки и слои
- Unity Learn: Unity Необходимое
- Слоевое обнаружение столкновений