У меня есть GameObject, который реализует IDragHandler и IDropHandler из UnityEngine.EventSystems.Unity Physics.Raycast, похоже, не правильно обнаруживает объект, который он ударил
В OnDrop, я хочу проверить, был ли этот объект удалено перед другим объектом. Я использую Physics.Raycast, но в некоторых случаях он возвращает true. Я использую экранную точку для луча как направление для своего луча, и это преобразование как источник для луча Raycast.
Мой код:
public void OnDrop(PointerEventData eventData)
{
var screenRay = Camera.main.ScreenPointToRay(new Vector3(eventData.position.x, eventData.position.y, 0.0f));
var thisToObjectBehind = new Ray(transform.position, screenRay.direction);
Debug.DrawRay(thisToObjectBehind.origin, thisToObjectBehind.direction, Color.yellow, 20.0f, false);
RaycastHit hit;
if (Physics.Raycast(thisToObjectBehind, out hit))
{
Debug.LogFormat("Dropped in front of {0}!", hit.transform);
}
}
Я использую перспективную камеру. Когда объект падает перед объектами прямо из экрана/камеры, Physics.Raycast иногда возвращает true, но «hit» содержит это, а не объект позади этого. Иногда он возвращает false. Ни один из этих двух результатов не ожидается, есть объекты позади этого, которые должны быть доступны Raycast.
Когда объект падает в передних объектах на окраине камеры, Physics.Raycast успешно находит объекты позади.
Отладочный луч выглядит хорошо, он нарисован из объекта, который я уронил, назад к объекту, который он должен ударить.
Примечание: Если я вместо использования screenRay устанавливаю thisToObjectBehind = новый Ray (transform.position, transform.forward * -1), Raycast преуспевает, поэтому не должно быть ничего плохого с коллайдерами. Тем не менее, я не хочу ограничивать себя тем, что нужно смотреть в камеру. – Helena
Каково значение eventData при успешном завершении и неудаче? – Bijan
Вам не нужна LayerMask? – Maakep