Al usar Vector3.MoveTowards, no hará nada por ninguno de los dos, porque uno no puede ejecutarse, lo que hace que el otro no se ejecute.
Aquí está mi código:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; public class PlaneAI : MonoBehaviour { public Transform[] runwayPoints; public Transform[] startTakeoffPoints; public Transform[] takeoffPoints; public NavMeshAgent navMeshAgent; public bool takeoff = false; bool departing = false; bool moving = false; int selectedRunway; public IEnumerator Depart() { navMeshAgent.SetDestination(runwayPoints[selectedRunway = Random.Range(0, runwayPoints.Length)].position); yield return new WaitForSeconds(3f); departing = true; } public void Update() { if (Input.GetKeyDown(KeyCode.P)) { StartCoroutine(Depart()); } GetComponent<LineRenderer>().SetPosition(0, new Vector3(transform.position.x, 1, transform.position.z)); GetComponent<LineRenderer>().SetPosition(1, navMeshAgent.destination); if (navMeshAgent.pathStatus == NavMeshPathStatus.PathComplete && departing && navMeshAgent.remainingDistance == 0) { Takeoff(); } if (moving && Vector3.Distance(transform.position, startTakeoffPoints[selectedRunway].position) <= 0.001f) { transform.position = Vector3.MoveTowards(transform.position, takeoffPoints[selectedRunway].position, 3); // this one does not work it should be after the other one transform.LookAt(takeoffPoints[selectedRunway]); takeoff = false; } } public void Takeoff() { navMeshAgent.enabled = false; GetComponent<Collider>().enabled = false; transform.LookAt(new Vector3(takeoffPoints[selectedRunway].position.x, 0, takeoffPoints[selectedRunway].position.z)); MoveTakeoff(); departing = false; } public void MoveTakeoff() { transform.position = Vector3.MoveTowards(transform.position, startTakeoffPoints[selectedRunway].position, 2); // this one does not work moving = true; takeoff = false; } }No hay errores de script, simplemente no funcionará.
Los únicos errores que no creo que estén relacionados son:
"Mundo no válidoAABB. El objeto es demasiado grande o está demasiado lejos del origen".
"AABB local no válido. La transformación del objeto está corrupta".
"La afirmación falló en la expresión: 'IsFinite(d)' UnityEngine.GUIUtility:processEvent(Int32, IntPtr)"
"La afirmación falló en la expresión: 'IsFinite(outDistanceForSort)' UnityEngine.GUIUtility:processEvent(Int32, IntPtr)"
"La afirmación falló en la expresión: 'IsFinite(outDistanceAlongView)' UnityEngine.GUIUtility:processEvent(Int32, IntPtr)"
Debe separar mejor su lógica de transición de estado de su lógica de actividad de estado. Tiene un código que debe ejecutarse cuando se produce una transición de estado en los mismos bloques que el código que debe ejecutarse en cada cuadro en el que un estado está activo.
Una forma de manejar esto es convirtiendo sus estados en rutinas:
public class PlaneAI : MonoBehaviour { public Transform[] runwayPoints; public Transform[] startTakeoffPoints; public Transform[] takeoffPoints; public NavMeshAgent navMeshAgent; public bool takeoff = false; bool departing = false; bool moving = false; int selectedRunway; LineRenderer lr; void Awake() { lr = GetComponent<LineRenderer>(); } IEnumerator Depart() { navMeshAgent.SetDestination(runwayPoints[selectedRunway = Random.Range(0, runwayPoints.Length)].position); yield return new WaitForSeconds(3f); departing = true; while(departing) { if (navMeshAgent.pathStatus == NavMeshPathStatus.PathComplete && navMeshAgent.remainingDistance == 0) { StartCoroutine(MoveTakeoff()); yield break; } yield return null; } } IEnumerator MoveTakeOff() { departing = false; moving = true; navMeshAgent.enabled = false; GetComponent<Collider>().enabled = false; transform.LookAt(new Vector3(takeoffPoints[selectedRunway].position.x, 0, takeoffPoints[selectedRunway].position.z)); while (moving) { if (Vector3.Distance(transform.position, startTakeoffPoints[selectedRunway].position) <= 0.001f) { StartCoroutine(TakeOff()) yield return break; } transform.position = Vector3.MoveTowards(transform.position, startTakeoffPoints[selectedRunway].position, 2); yield return null; } } IEnumerator Takeoff() { moving = false; takeOff = true; transform.LookAt(takeoffPoints[selectedRunway]); while (takeOff) { if (Vector3.Distance(transform.position, startTakeoffPoints[selectedRunway].position) <= 0.001f) { takeoff = false; yield break; } transform.position = Vector3.MoveTowards(transform.position, takeoffPoints[selectedRunway].position, 3); yield return null; } } void Update() { if (Input.GetKeyDown(KeyCode.P)) { StopAllCoroutines(); StartCoroutine(Depart()); } lr.SetPosition(0, new Vector3(transform.position.x, 1, transform.position.z)); lr.SetPosition(1, navMeshAgent.destination); } }Idealmente, los estados deberían ser un solo enumerador en lugar de varios valores booleanos, pero espero que esto muestre a lo que me refiero.