Unity Physics2D.Raycast с большими 2D коллайдерами

У меня есть очень простой компонент Unity, который проверяет, находится ли экран мыши внутри 2D-коллайдера.

var screenRay = Camera.main.ScreenPointToRay(new Vector3(eventData.position.x, eventData.position.y, 0.0f));
RaycastHit2D hit = Physics2D.Raycast(screenRay.origin, screenRay.direction);
if (hit)
{
    Debug.Log("hit something");
}

Я добавляю объект изображения на холст, который отрисовывается в пространстве экрана: камера и компонент Box Collider 2D к изображению.

Код над логами «попал во что-то», когда указатель мыши находится внутри коробки Collider 2D, но не когда снаружи, чего я и хочу.

Однако это верно только в том случае, если размер коробчатого коллайдера меньше 120 x 120. Если это тот размер или больше, я начинаю получать вывод журнала везде на экране — Physics2D.Raycast возвращает что-то по всему экрану. Physics2D.Raycast, кажется, думает, что коллайдер внезапно занимает весь экран, которого он не делает, он даже не близок. Сокращение коллайдера до 115 x 115 решает проблему, но, как вы можете себе представить, я не хочу особого поведения на некоторых размерах коллайдера.
Размер изображения 100×100. Если я сделаю коллайдер размером 1×1 (едва видимый), то Raycaster даст удар по всему изображению 100×100.

Размер изображения не влияет. Кто-нибудь знает, почему этот волшебный размер вдруг больше, чем указано?

EDIT: у меня та же проблема с CircleCollider2D — если радиус идет выше где-то около 100, внезапно я сталкиваюсь с ним по всему экрану.

1 ответ

  1. Physics2D.Raycast предназначен для использования в 2D пространстве. Как я использовал элементы пользовательского интерфейса в 3D пространстве, Physics2D.Raycast не работает как ожидалось, GetRayIntersection должен использоваться вместо этого. Этот код работал нормально:

    var screenRay = Camera.main.ScreenPointToRay(new Vector3(eventData.position.x, eventData.position.y, 0.0f));
    RaycastHit2D hit = Physics2D.GetRayIntersection(screenRay);
    if (hit)
    {
        Debug.Log("hit something");
    }