SmartQuery /ВОПРОС → ПРИМЕР → ПОНЯТНЫЙ ОТВЕТ
Языки и платформы

Unity: hitInfo луча и контакты столкновения

В Unity нет отдельной универсальной системы «Hitinfo», которая создаётся при любом столкновении. Именем hitInfo часто называют переменную типа RaycastHit — результат проверки лучом. Событие OnCollisionEnter получает другой тип, Collision, из которого читают точки контакта.

Луч: получить RaycastHit

Сохраните скрипт как RayProbe.cs и прикрепите к объекту в 3D-сцене. Перед ним должен находиться объект с Collider на расстоянии не более 10 единиц. Луч направлен по локальной оси forward.

using UnityEngine;

public class RayProbe : MonoBehaviour
{
    void FixedUpdate()
    {
        RaycastHit hitInfo;
        if (Physics.Raycast(transform.position, transform.forward,
            out hitInfo, 10f, ~0, QueryTriggerInteraction.Ignore))
        {
            Debug.DrawLine(transform.position, hitInfo.point, Color.green);
            Debug.Log("Hit: " + hitInfo.collider.name
                + ", distance: " + hitInfo.distance);
        }
    }
}

Читайте поля hitInfo только в ветке успешного Raycast. point — точка попадания в мировых координатах, normal — нормаль поверхности, collider — задетый Collider, distance — расстояние от начала луча. Здесь trigger-colliders явно игнорируются; маска ~0 включает все слои.

Столкновение: получить ContactPoint

Для реального контакта физических объектов нужен OnCollisionEnter. Сохраните второй скрипт как ContactProbe.cs и прикрепите к одному из сталкивающихся объектов:

using UnityEngine;

public class ContactProbe : MonoBehaviour
{
    void OnCollisionEnter(Collision collision)
    {
        if (collision.contactCount == 0)
            return;

        ContactPoint contact = collision.GetContact(0);
        Debug.DrawRay(contact.point, contact.normal, Color.yellow, 2f);
        Debug.Log("Contact with: " + collision.gameObject.name);
    }
}

Для обычного 3D collision event на объектах нужны Collider, а хотя бы у одного — некинематический Rigidbody. Trigger и OnTriggerEnter — отдельный путь: событие получает Collider, а не Collision. Для 2D-физики применяются другие типы и методы, например RaycastHit2D и OnCollisionEnter2D.

Как выбрать подход

  • Проверка объекта перед камерой, прицеливание и измерение расстояния — задача луча.
  • Реакция на начало физического контакта, звук удара и контактная нормаль — задача collision event.
  • Вход персонажа в область без физического упора — обычно задача trigger.

Нанесение урона или изменение здоровья — ваша игровая логика; наличие ContactPoint само по себе её не реализует. Не следует каждый физический кадр безусловно наносить урон, если задуман один удар.

Если результат не появляется

  1. Включите Scene view и проверьте направление луча и расстояние до цели. Луч, начинающийся внутри Collider, не обнаруживает этот Collider обычным Raycast.
  2. Для столкновения проверьте Rigidbody, isKinematic, isTrigger и матрицу взаимодействия слоёв.
  3. Убедитесь, что используются согласованные 3D-компоненты и что скрипт/объект активны в нужный момент.
  4. После попадания сравните имя объекта и точку с ожидаемой целью, а не только наличие сообщения в Console.

Документация