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. Логика на метках без проверок
Объект мог быть уничтожен параллельно. Проверяйте ссылки, с которыми работаете.