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

В чем разница между OnCollisionEnter() и OnTriggerEnter() в Unity?

2.2 Middle🔥 122 комментариев
#Unity Core

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

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

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

Сравнение методов OnCollisionEnter и OnTriggerEnter в Unity

В Unity система физики предоставляет два основных механизма для обнаружения взаимодействий между объектами: физическое столкновение (Collision) и триггерное взаимодействие (Trigger). Методы OnCollisionEnter() и OnTriggerEnter() являются ключевыми событиями, реагирующими на начало этих взаимодействий, но их принципы работы и применения существенно различаются.

Ключевые различия в механике работы

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

// Пример использования OnCollisionEnter
void OnCollisionEnter(Collision collision) {
    // collision содержит детальную информацию о столкновении
    ContactPoint contact = collision.contacts[0];
    Vector3 force = collision.impulse;
    
    if (collision.gameObject.CompareTag("Enemy")) {
        Destroy(collision.gameObject);
    }
}

OnTriggerEnter() вызывается, когда объект с коллайдером-триггером пересекает область другого коллайдера (который также может быть триггером или обычным коллайдером). Физический движок не обрабатывает такие взаимодействия как столкновения — объекты свободно проходят друг сквозь друга, никаких сил или отталкивания не применяется.

// Пример использования OnTriggerEnter
void OnTriggerEnter(Collider other) {
    // other представляет просто коллайдер, без детальной физической информации
    
    if (other.CompareTag("Pickup")) {
        playerScore += 10;
        Destroy(other.gameObject);
    }
}

Основные технические различия

  • Физическая обработка: OnCollisionEnter требует расчета физики (силы, трения), OnTriggerEnter — лишь проверки пересечения геометрии.
  • Параметры методов: OnCollisionEnter получает объект Collision с детальной информацией (точки контакта, импульс). OnTriggerEnter получает просто Collider другого объекта.
  • Настройка коллайдеров: Для работы OnCollisionEnter коллайдеры не должны быть триггеры. Для OnTriggerEnter хотя бы один из участвующих коллайдеров должен быть помечен как триггер.
  • Наличие Rigidbody: Для OnCollisionEnter требуется хотя бы один активный Rigidbody на объектах. Для OnTriggerEnter Rigidbody может отсутствовать на объекте с триггером (но должен быть на объекте, который его пересекает, если нужны события).

Практические сценарии применения

OnCollisionEnter идеально подходит для:

  • Систем разрушения объектов при ударах
  • Игровой логики, основанной на физическом воздействии (падение, толчки)
  • Расчетов повреждений с учетом силы столкновения
  • Реализации сложных физических взаимодействий (например, мяч, отскакивающий от стен)

OnTriggerEnter чаще используется для:

  • Обнаружения прохождения через области (чекпойнты, зоны поражения)
  • Систем сбора предметов без физического воздействия
  • Активации событий при приближении игрока (NPC диалоги)
  • Нефизических датчиков и триггерных зон

Вывод

Выбор между этими методами определяется дизайнерскими потребностями. Если вам нужна реалистичная физическая реакция с силами и столкновениями — используйте OnCollisionEnter. Если требуется лишь сигнализировать о пересечении объектов без физического сопротивления — выбирайте OnTriggerEnter. Правильное понимание этой разницы критически важно для создания корректных игровых механик в Unity.

В чем разница между OnCollisionEnter() и OnTriggerEnter() в Unity? | PrepBro