Menu
CoddyTech

Вход и выход

Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 19 из 63.

Триггер отправляет ещё два сообщения. OnTriggerExit(Collider other) выполняется один раз на физическом шаге, когда перекрытие заканчивается, независимо от того, как именно оно заканчивается. OnTriggerStay(Collider other) выполняется на каждом физическом шаге, пока длится перекрытие, по умолчанию 50 раз в секунду, как и FixedUpdate(). Все три метода принимают один и тот же Collider.

Этот восходящий поток воздуха поднимает всё, что в нём плавает, и сообщает, когда объект покидает его:

public float lift = 15f;

void OnTriggerStay(Collider other)
{
    other.attachedRigidbody.AddForce(Vector3.up * lift);
}

void OnTriggerExit(Collider other)
{
    Debug.Log(other.name + " left the updraft");
}

Сила должна прикладываться на физическом шаге, поэтому для этого подходит OnTriggerStay: толчок прикладывается один раз за шаг, пока мяч находится внутри, и прекращается в тот же момент, когда он покидает область. У восходящего потока воздуха нет Rigidbody, поэтому у каждого объекта, попадающего в него, он должен быть, и здесь attachedRigidbody никогда не равен null. Чтобы задать величину в секунду внутри OnTriggerStay, умножь её на Time.deltaTime, которое во время физического шага равно его длительности — 0.02. При каждом входе для одного и того же коллайдера вызывается один OnTriggerEnter, а затем один OnTriggerExit.

challenge icon

Задание

Легко

Жёлтая зона, нарисованная на полу склада, — это триггер, а lamp — сигнальная лампа на столбе рядом с ней. Напиши LoadingBay, чтобы лампа показывала, есть ли что-нибудь в зоне:

  • В начале игры зона пуста, поэтому лампа выключена (lamp.enabled = false).
  • Пока в зоне находится хотя бы один объект, лампа включена.
  • Когда уходит последний объект, лампа снова выключается.

Два ящика и игрок могут одновременно находиться в зоне, поэтому уход одного из них не означает, что зона пуста. Нажми Play и перемещай ящики внутрь и наружу стрелками, затем нажми Check.

Попробуйте сами

using UnityEngine;

public class LoadingBay : MonoBehaviour
{
    public Light lamp;

    // Лампа горит, пока в отсеке что-то есть, и гаснет, когда отсек пуст
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Физика и игровой процесс