#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:
Я вижу две проблемы
- Вы перемещаете свой объект с помощью
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
величина - В
Vector3 vel = (target - transform.position).normalized * speed; Vector3 desiredVel = (target - transform.position).normalized * speed; Vector3 steeringForce = desiredVel - vel;
вы сохраняете и вычитаете один и тот же вектор .. ваш
steeringForce
обречен быть всегда0,0,0
!