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 само по себе её не реализует. Не следует каждый физический кадр безусловно наносить урон, если задуман один удар.
Если результат не появляется
- Включите Scene view и проверьте направление луча и расстояние до цели. Луч, начинающийся внутри Collider, не обнаруживает этот Collider обычным Raycast.
- Для столкновения проверьте Rigidbody, isKinematic, isTrigger и матрицу взаимодействия слоёв.
- Убедитесь, что используются согласованные 3D-компоненты и что скрипт/объект активны в нужный момент.
- После попадания сравните имя объекта и точку с ожидаемой целью, а не только наличие сообщения в Console.