Предотвращение препятствий в Unity, используя raycasts.C # - PullRequest
0 голосов
/ 22 мая 2018

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

    ray = new Ray(transform.position + Vector3.up, transform.forward);
    Vector3 posInicial = transform.position;

    if (Physics.Raycast(ray, out hit, 55f)) // Front sensor
    {
        if (hit.collider.tag == ("Pick Up")) // If robot detects pick up, it goes towards it
        {
            Debug.DrawLine(ray.origin, hit.point, Color.red);
            transform.position = Vector3.MoveTowards(transform.position, hit.point, Time.deltaTime * speed);
        }
        else
        {
            transform.Rotate(0, -80 * Time.deltaTime, 0); // Rotate if front sensor doesn't detect pick up
            Debug.DrawLine(ray.origin, hit.point, Color.blue);
        }
    }
    else
    {
        transform.position += transform.forward * speed * Time.deltaTime; // Go forward
        Debug.DrawLine(ray.origin, hit.point, Color.white);
    }
    if (Physics.Raycast(posInicial, Quaternion.AngleAxis(45f, transform.up) * transform.forward, out hit2, 20f))
    {
        transform.Rotate(0, -80 * Time.deltaTime, 0); // Rotate left if right detected
        Debug.DrawLine(posInicial, hit2.point, Color.yellow);
    }
    if (Physics.Raycast(posInicial, Quaternion.AngleAxis(-45f, transform.up) * transform.forward, out hit3, 20f))
    {
        transform.Rotate(0, 80 * Time.deltaTime, 0); // rotate right if detected left
        Debug.DrawLine(posInicial, hit3.point, Color.cyan);
    }
}

1 Ответ

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

Я не уверен, почему вы пытаетесь реализовать это самостоятельно.Если это потому, что вас интересует алгоритм и вы пытаетесь экстраполировать его в будущем на реальный мир, это нормально.

Но на всякий случай в Unity уже есть что-то под названием NavMesh, которое в основномпредоставить ИИ игровым объектам, например, врагам, чтобы они идентифицировали препятствия, чтобы избежать их при перемещении от одной точки к другой на сцене.

  • Выбор геометрии сцены, которая должна влиять на навигацию - поверхности, которые можно пройтии препятствия.
  • Установите флажок Статика навигации, чтобы включить выбранные объекты в процесс выпечки NavMesh.
  • Настройте параметры выпечки в соответствии с размером вашего агента.
  • Нажмите кнопку запекания, чтобы создать NavMesh

Как только вы запекли сцену, вы можете добавить навигационную сетку к игровому объекту:

public class EnemyMovement : MonoBehaviour
{
    NavMeshAgent nav; 

    function Awake ()
    {
        nav = GetComponent(NavMeshAgent);
    }

    //So here it will be chasing the player
    function Update ()
    {
        nav.SetDestination (player.position);
    }
}

Вы можете прочитать больше об этом здесь и следовать этому учебник

...