Алгоритм поиска автомобилей

#c# #unity3d

Вопрос:

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

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

Более конкретно, моя проблема заключается в том, что моя реализация не обновляется wayIndex , и это приводит к тому, что цель никогда не переходит к следующей точке waypoints массива.

 using System.Collections; using System.Collections.Generic; using UnityEngine;  public class Follower : MonoBehaviour {  public GameObject vehicle;  public float[] speeds = {15.0f,25.0f,35.0f};  public int pathChoice;   [SerializeField]  public Transform[] waypoints;  public Transform[] waypoints2;   [SerializeField]  public float speed;  private int wayIndex = 0;   private Vector3 target;  private Vector3 steering;   private void Start(){  int speedIndex = UnityEngine.Random.Range(0, 3);  int pathIndex = UnityEngine.Random.Range(0, 2);  speed = speeds[speedIndex];  pathChoice = pathIndex;   if (pathIndex == 0){  steering = Vector3.zero;  target = waypoints[wayIndex].position;  transform.position = waypoints[wayIndex].transform.position;  }else if (pathIndex == 1){  steering = Vector3.zero;  target = waypoints2[wayIndex].position;  transform.position = waypoints2[wayIndex].transform.position;  }  }   private void Update(){  MoveVehicle();  // transform.Rotate(-90f,0,0,Space.Self);  }   private void MoveVehicle(){  if (pathChoice == 0){  if (wayIndex lt;= waypoints.Length - 1){  target = waypoints[wayIndex].position;   Vector3 velocity = (target - transform.position).normalized * speed;  Vector3 seekForce = seek(target);   steering = steering   seekForce;  Vector3 finalVel = (velocity   steering);    // transform.position = Vector3.MoveTowards(transform.position,target,speed * Time.deltaTime);  transform.position = transform.position   finalVel * Time.deltaTime;  transform.LookAt(target);   // var targetRotation = Quaternion.LookRotation(target- transform.position);  // transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, speed * Time.deltaTime);    if (transform.position == waypoints[wayIndex].transform.position){  wayIndex  = 1;  }   if (transform.position == waypoints[waypoints.Length - 1].position){  speed = 0.0f;  }  }  }else if (pathChoice == 1){  if (wayIndex lt;= waypoints2.Length - 1){  target = waypoints2[wayIndex].position;  transform.position = Vector3.MoveTowards(transform.position,target,speed * Time.deltaTime);   // var targetRotation = Quaternion.LookRotation(target- transform.position);  // transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, speed * Time.deltaTime);   transform.LookAt(target);    if (transform.position == waypoints2[wayIndex].transform.position){  wayIndex  = 1;  }   if (transform.position == waypoints2[waypoints2.Length - 1].position){  speed = 0.0f;  vehicle.GetComponentlt;Followergt;().enabled = false;  vehicle.GetComponentlt;Collisionsgt;().enabled = false;  Destroy(vehicle);  }  }   }  }   private Vector3 seek(Vector3 target){  Vector3 vel = (target - transform.position).normalized * speed;  Vector3 desiredVel = (target - transform.position).normalized * speed;  Vector3 steeringForce = desiredVel - vel;  return steeringForce;  } }  

Комментарии:

1. Крайне маловероятно, что плавающие точки в вашем преобразовании равны точке пути. Вам нужно провести нечеткое сравнение mire

Ответ №1:

Я вижу две проблемы

  1. Вы перемещаете свой объект с помощью
     transform.position = transform.position   finalVel * Time.deltaTime;  

    Так что может случиться, что это превысит цель, поэтому проверка

     if (transform.position == waypoints[wayIndex].transform.position)  

    который использует диапазон точности 0.00001 никогда не становится правдой.

    Раньше этого не происходило, потому MoveTowards что предотвращает какие-либо промахи.

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

     if(Vector3.Distance(transform.position, waypoints[wayIndex].transform.position) lt;= THRESHOLD)  

    где THRESHOLD должен быть диапазон, достаточно большой, чтобы не быть превышен finalVel =gt; Чем-то большим, чем максимальная gt; finalVel величина

  2. В
     Vector3 vel = (target - transform.position).normalized * speed;  Vector3 desiredVel = (target - transform.position).normalized * speed;  Vector3 steeringForce = desiredVel - vel;  

    вы сохраняете и вычитаете один и тот же вектор .. ваш steeringForce обречен быть всегда 0,0,0 !