2017-01-17 10 views
0

У меня есть очень простой компонент Unity, который проверяет, находится ли положение экрана мыши внутри 2D-коллайдера.Unity Physics2D.Raycast имеет проблемы с большими 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"); 
} 

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

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

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

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

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

+0

Это похоже на невидимое дополнение, которое растет бесконечно выше определенного размера. – Helena

ответ

0

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"); 
}