Raycast 2d не работает в Unity3d

Я новичок в Unity и заблокировал второй день простой попыткой raycast. Это сценарий, который я использую для raycast:

void Update () {
    Debug.DrawLine(transform.position, transform.position - transform.up);
    RaycastHit2D[] hits = Physics2D.RaycastAll(transform.position, transform.position - transform.up, Mathf.Infinity);
    if(hits.Length > 0)
    {
        Debug.Log("Hit");
    }
}

Я прикрепил этот скрипт к квадрату и поместил рядом с ним другой квадрат, который действует как цель, а также добавил к цели 2d-бокс-коллайдер. Я отключил функцию "самого попадания", как описано здесь: http://answers.unity3d.com/questions/756380/raycast-ignore-itself.html После выполнения всех этих шагов raycast ничего не попадает, коллайдер объекта попадания всегда равен нулю (проверено в режиме отладки, также в консоли ничего не написано). Я нарисовал линию отладки, и она действительно указывает на целевой квадрат, как на скриншотах. введите здесь описание изображения  введите описание изображения здесь

Пожалуйста, помогите мне разобраться, что я делаю не так.


person Ion C    schedule 21.09.2017    source источник
comment
вы используете 2d raycast на коллайдере 3d box. вам нужно либо использовать 2d-коллайдер для сопоставления, либо вместо этого использовать обычный Raycast   -  person ryeMoss    schedule 21.09.2017


Ответы (1)


Physics.Raycast предназначен для 3D-коллайдеров, включая Box Collider, Sphere Collider и другие. В их названиях нет 2D.

Physics2D.Raycast предназначен для 2D-коллайдеров. Вам нужен Box Collider 2D, так как это Sprite Renderer, который представляет собой 2D-объект.

ИЗМЕНИТЬ:

С вашим редактированием проблема в том, что направление raycast слишком короткое. Вы должны умножить его на число. Значение 100 должно подойти.

public float distance = 100f;

void Update()
{
    Debug.DrawLine(transform.position, transform.position + transform.right);
    RaycastHit2D hit = Physics2D.Raycast(transform.position, transform.position + transform.right * distance, Mathf.Infinity);
    if (hit.collider != null)
    {
        Debug.Log("hit: " + hit.collider.name);
    }
}
person Programmer    schedule 21.09.2017
comment
Я знаю об этом, это экран из моей отчаянной попытки заставить его работать ... Я забыл вернуть его для скриншота, извините за это. Так что если это 2D-коллайдер, он все равно не работает. Любые другие идеи, что мне не хватает? - person Ion C; 21.09.2017
comment
В этом случае обновите свой снимок экрана тем, что у вас должно быть, и я обновлю свой ответ. Обязательно добавьте в него EDIT. - person Programmer; 21.09.2017
comment
Я попытался начать новый проект с нуля в надежде, что это безуспешно решит мою проблему :(. Я прикрепил новые экраны и новый измененный скрипт, в котором я пытаюсь использовать raycastAll. - person Ion C; 21.09.2017
comment
Большое спасибо. Умножение на 100 устранило проблему. Но я не понимаю, зачем мне это делать. Я думал, что мне нужно указать направление, и он пройдет на максимальное указанное расстояние (Mathf.Infinity в моем случае) и вернет первую точку столкновения или ноль. - person Ion C; 21.09.2017
comment
Mathf.Infinity - это внутренняя физическая система, определяющая, как далеко должна идти лучшая передача от заданного направления. Проблема в том, что указанное направление слишком короткое. Взгляните на Debug.DrawLine. Вы увидите, что это слишком выстрел. Теперь также измените второй параметр Debug.DrawLine на transform.position + transform.right * distance. Вы увидите, какова длина линии. - person Programmer; 21.09.2017
comment
Почему тогда указывается расстояние? Согласно документам, это максимальное расстояние для проецирования луча. Physics2D.Raycast.html]. Я попытался изменить его на 1, 0, -100, но он все равно попадает в коллайдер. Разве этот параметр не бесполезен, потому что я уже указываю максимальное расстояние как вектор (второй параметр)? - person Ion C; 21.09.2017
comment
Ваш тест 1,0, -100 пройден. Я пробовал с 0, и ничего подобного, как я сказал выше, он не обнаружил. Я пробовал это с 3, и он что-то обнаружил, но вам нужно подойти очень близко к другому объекту, если вы хотите, чтобы он что-то обнаружил. Вы используете третий параметр, чтобы контролировать, какую часть второго параметра использовать. Наконец, вы можете использовать фактическое направление, например Vector3.right во втором параметре, и вы вообще не столкнетесь с какими-либо проблемами. Причина, по которой я его не использовал, заключается в том, что вы хотите, чтобы луч был направлен в сторону персонажа. - person Programmer; 21.09.2017