← Назад к вопросам

Что такое Collision Matrix в Unity и для чего она используется?

1.2 Junior🔥 121 комментариев
#Unity Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Collision Matrix в Unity?

Collision Matrix (Матрица коллизий) — это инструмент в движке Unity, который представляет собой таблицу или сетку, позволяющую тонко настраивать, какие слои (Layers) объектов могут сталкиваться (collide) или взаимодействовать через триггеры (trigger) друг с другом. По сути, это система избирательного управления физическими взаимодействиями между объектами на основе их принадлежности к определённым слоям.

Основное назначение и цели использования

Матрица коллизий используется для решения нескольких критически важных задач в разработке:

  • Оптимизация производительности. Это её главная роль. Каждая проверка на столкновение (collision detection) требует вычислительных ресурсов процессора. Если позволить всем объектам в сцене проверяться друг с другом, производительность игры может катастрофически упасть, особенно на мобильных платформах или в сложных сценах. Матрица позволяет отключить столкновения между слоями, которые по смыслу игры никогда не должны взаимодействовать (например, слой фоновых декораций (Background) и слой летящих пуль (Projectiles)).
  • Логическое разделение взаимодействий. Она помогает реализовать игровую логику. Например, вы можете настроить так, что пули игрока (PlayerProjectiles) попадают во врагов (Enemies), но игнорируют других игроков в кооперативном режиме или союзников.
  • Упрощение настройки сцены. Вместо того чтобы вручную настраивать свойства Collider и Rigidbody на каждом объекте, вы глобально задаёте правила для целых категорий объектов через их слои.

Как работает Collision Matrix?

Механика основана на двух ключевых компонентах:

  1. Слои (Layers). Каждому игровому объекту (GameObject) можно назначить один из 32 доступных слоёв (пользовательских или стандартных).
  2. Таблица взаимодействий. Это матрица 32x32, где каждая ячейка соответствует паре слоёв. Установка или снятие флажка в ячейке включает или отключает физическое взаимодействие (столкновение и вызов соответствующих событий) между объектами этих двух слоёв.

Где найти и как настроить?

Матрица коллизий настраивается в глобальных настройках проекта: Edit → Project Settings → Physics (для 3D) или Physics 2D (для 2D).

Вы увидите секцию Layer Collision Matrix. Это и есть та самая таблица, где строки и столбцы — это названия ваших слоёв.

Схематичный пример Collision Matrix в Project Settings

Практический пример настройки

Допустим, у нас есть следующие пользовательские слои:

  • Player
  • Enemy
  • Projectile
  • Environment

Желаемая логика:

  • Игрок и враги сталкиваются с окружением (стенами, полом).
  • Игрок и враги не проходят друг сквозь друга.
  • Снаряды попадают во врагов и игрока, но игнорируют другие снаряды и окружение (предположим, это магические снаряды).

В матрице мы снимем флажки в следующих ячейках:

  • ProjectileProjectile (снаряды не сталкиваются друг с другом)
  • ProjectileEnvironment (снаряды летят сквозь стены)

Важно: Настройки в Physics и Physics 2D — это две полностью независимые матрицы. Если ваша игра использует и 2D, и 3D физику, настраивать нужно оба раздела.

Взаимосвязь с компонентами на объекте

Матрица коллизий работает в тандеме с компонентами на GameObject:

  • Collider / Collider 2D: Определяет физическую форму объекта.
  • Rigidbody / Rigidbody 2D: Делает объект участником физического симулятора.
  • Слой объекта (Layer): Определяет его "группу" в матрице.

Даже если у двух объектов есть коллайдеры, но их слои в матрице не пересекаются (флажок снят), функция OnCollisionEnter() вызвана не будет, а объекты будут проходить друг сквозь друга. Для триггеров (OnTriggerEnter()) правило аналогично.

Пример кода для динамического управления

Иногда правила столкновений нужно менять во время выполнения игры. Это можно сделать через скрипт, используя статические методы класса Physics или Physics2D.

using UnityEngine;

public class DynamicCollisionControl : MonoBehaviour
{
    void Start()
    {
        // Разрешить столкновение между слоями 8 (Player) и 9 (Enemy)
        Physics.IgnoreLayerCollision(8, 9, false);

        // Запретить столкновение между своим слоем и слоем Projectile (10)
        // Например, чтобы сделать игрока временно невидимым для снарядов.
        Physics.IgnoreLayerCollision(gameObject.layer, 10, true);
    }

    void MakeInvulnerableToEnemies(bool isInvulnerable)
    {
        // Временное отключение столкновений с врагами
        int playerLayer = LayerMask.NameToLayer("Player");
        int enemyLayer = LayerMask.NameToLayer("Enemy");
        Physics.IgnoreLayerCollision(playerLayer, enemyLayer, isInvulnerable);
    }
}

Заключение

Collision Matrix — это мощный и обязательный к пониманию инструмент для любого разработчика на Unity. Она лежит на стыке оптимизации и геймдизайна. Правильное её использование позволяет значительно снизить нагрузку на физический движок, избежать багов с непреднамеренными столкновениями и чётко реализовать задуманные механики взаимодействия между различными типами объектов в игре. Пренебрежение настройкой матрицы коллизий — верный путь к проблемам с производительностью в готовом проекте.

Что такое Collision Matrix в Unity и для чего она используется? | PrepBro