Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

255
Views
Vector3.MoveTowards no funciona. No se mueve ni muestra ningún error.

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)"

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!