Raycast, в Unity 3d не обнаруживает все препятствия - PullRequest
0 голосов
/ 27 мая 2018

Я пытаюсь сделать очень простую гоночную игру со сферами, однако у меня много проблем.

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

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

Я создал простойсфера как противник и написал сценарий, чтобы он мог перемещаться и обнаруживать препятствия. Вот функция обновления:

void FixedUpdate()
{
    transform.Translate(Vector3.forward * Time.deltaTime * speed);

    if (Physics.Raycast(transform.position, transform.forward, 100.0f))
        print("There is something in front of the object!");

}

Сообщение печатается только тогда, когда есть куб вперед, и оно не обнаруживает никаких других препятствий.Что может быть не так?Кроме того, есть ли идея, как двигаться влево или вправо, когда противник передаст препятствие?

обнаруженное препятствие

иерархия

cube01, который является дочерним элементом препятствия2, которое не обнаружено

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

С помощью raycast обнаруживаются только компоненты коллайдера, убедитесь, что у вас есть соответствующий коллайдер (размер коллайдера не обязательно соответствует размеру визуализируемой сетки).Обычно также важны слои, для которых важны объекты, но используемый вами синтаксис в любом случае не проверяет маску слоя

0 голосов
/ 28 мая 2018

Рекомендации по физике Unity (как и в https://unity3d.com/pt/learn/tutorials/topics/physics/physics-best-practices) рекомендует не использовать Raycasts в FixedUpdate, поскольку он труден для обработки и может работать не всегда.

Есть также несколько советово матричных слоях, которые помогут вам улучшить производительность и избежать таких ошибок.

Удачи!

0 голосов
/ 27 мая 2018

Вы можете использовать Debug.DrawLine () или Debug.DrawLine (), чтобы отладить линию и посмотреть, пересекает ли она препятствия или нет.Вот документация для них DrawRay DrawLine Для перемещения вправо и влево я думаю, что вы можете добавить что-то вроде этого

void FixedUpdate()
{
    Vector3 dir = Vector3.forward * Time.deltaTime * speed;
    if (Physics.Raycast(transform.position, transform.forward, 100.0f))
    {
        print("There is something in front of the object!");
        dir += Vector3.Right * horizontalSpeed * Time.deltaTime;
    }
}

Вы могли бы также рассмотреть лучевое излучение двух лучейопределить направление наклона, если оно будет слева или справа.

...