Unity C#

OnTriggerExit в Unity C# — выход объекта из триггера

OnTriggerExit в Unity — событие выхода из триггера. Вызывается, когда коллайдер перестал пересекать триггер-коллайдер. Зеркально OnTriggerEnter: вход зоны прозвучал — выход должен прозвучать.

Условия вызова

  • Оба объекта с компонентом Collider, как минимум один коллайдер — триггер, как минимум один — физическое тело.
  • Вызывается на том шаге FixedUpdate, когда Unity обнаружила, что пересечение прекращено.
  • Принимает параметр Collider other — вышедший коллайдер.

Пример: включение и выключение подсказки

using UnityEngine;

public class HintZone : MonoBehaviour
{
    public GameObject hint;

    void Start()
    {
        if (hint != null)
        {
            hint.SetActive(false);
        }
    }

    void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player") && hint != null)
        {
            hint.SetActive(true);
        }
    }

    void OnTriggerExit(Collider other)
    {
        if (other.CompareTag("Player") && hint != null)
        {
            hint.SetActive(false);
        }
    }
}

Ограничение, о котором предупреждает Unity

Как и для OnCollisionExit: событие выхода не приходит, если объект деактивирован или уничтожён внутри зоны. Документация объясняет: отслеживать все пересекающиеся пары в сцене ради корректных «выходов» стоило бы памяти и процессора в каждом проекте, даже том, которому это не нужно.

Рекомендация документации — записывать входящие коллайдеры и обрабатывать «обрыв контакта» самостоятельно при деактивации.

Пример: самостоятельный учёт с очисткой

using UnityEngine;
using System.Collections.Generic;

public class PersistentZone : MonoBehaviour
{
    private Dictionary tracked = new Dictionary();
    private int score = 0;

    void OnTriggerEnter(Collider other)
    {
        tracked[other] = true;
        score += 10;
    }

    void OnTriggerExit(Collider other)
    {
        tracked.Remove(other);
        score -= 10;
    }

    // Ручная обработка: зону выключили, а контакты остались
    void OnDisable()
    {
        foreach (var entry in tracked)
        {
            Debug.Log("Контакт оборван с " + entry.Key.name);
        }
        tracked.Clear();
        score = 0;
    }
}

В отличие от одиночного флага, словарь знает, какие именно объекты в зоне — из него строятся списки целей, подсчёты и проверки «зона пуста».

Когда Exit не придёт — полный список

  • Объект уничтожен через Destroy.
  • Объект деактивирован через SetActive(false).
  • Коллайдер удалён или выключен.
  • Объект телепортирован далеко за один физический шаг — Unity может не заметить пересечение.
  • Изменены настройки слоёв так, что пара перестала проверяться.

Частые ошибки

1. Выход по первому объекту

В зоне три игрока, один вышел — подсказка скрылась, хотя игроки остались. Считайте входы.

2. Забытая очистка при выключении

Зона деактивирована: события выхода не будет, внутренний счётчик остался «загрязнённым», при повторном включении счёт пойдёт не от нуля.

3. Логика на метках без проверок

Объект мог быть уничтожен параллельно. Проверяйте ссылки, с которыми работаете.

Связанные статьи