Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

257
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda