Recién estoy empezando por favor disculpe la gran ignorancia.
Estoy escribiendo ac# script en Unity como parte de la capacitación básica. Estoy haciendo el módulo de audio 3D y pensé en tratar de ser un poco más elegante que el alcance de esta lección en particular, que se supone que tiene un objeto que vuela a través de una ventana en una escena preconstruida y hace un 3D. sonido mientras se mueve.
Quería condicionar el movimiento del objeto a que un jugador se acercara a él en el espacio 3D. Descubrí cómo desencadenar el movimiento de un objeto en un script con una instrucción if que cambia los parámetros de transformación del objeto al que se adjunta el script cuando una variable 'distanceFromObject' es < 2. Funciona, sin embargo, el script se ejecuta en el sección de actualización del script que se ejecuta una vez cada cuadro. Esto significa que los parámetros de transformación del objeto se cambian en cada cuadro como se esperaba, pero, por supuesto, dejan de hacerlo cuando la distancia entre el objeto que se mueve y el jugador supera los 2.
Veo el error que cometí porque si el objeto se aleja cuando el jugador se acerca, inevitablemente eventualmente se alejará lo suficiente como para que la variable distanceFromObject crezca más de 2, luego se detiene y simplemente flota en su lugar. Aunque no sé cómo solucionarlo.
Necesito la secuencia de comandos para verificar la distancia entre el objeto y el jugador en cada cuadro para que active la instancia en que el jugador se acerca lo suficiente, y cuando se acercan lo suficiente, necesito que el objeto se aleje, sin embargo, una vez que se ha activado para moverme, necesito que el objeto continúe moviéndose, pero el script deja de verificar cuál es la distancia.
El guión se ve así
using System.Collections; using System.Collections.Generic; using UnityEngine; public class FlyOff : MonoBehaviour { public Vector3 rotateChange; public Vector3 positionChange; public float distanceFromObject; public GameObject character; // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { distanceFromObject = Vector3.Distance(character.transform.position, this.gameObject.transform.position); print (distanceFromObject); if (distanceFromObject < 2) { transform.Rotate (rotateChange); transform.position += positionChange; } } }Use banderas en lugar de escribir su lógica en la declaración if :
public class FlyOff : MonoBehaviour { // fields removed for more readability // use a flag that's set to true/false private bool isCloseEnough = false; void Update() { distanceFromObject = Vector3.Distance(character.transform.position, this.gameObject.transform.position); print (distanceFromObject); // set the flag to true when player is close enough if (distanceFromObject < 2) { isCloseEnough = true; } // even if the player gets far, the flag will remain true if (isCloseEnough) { transform.Rotate (rotateChange); transform.position += positionChange; } } }Incluso puede aplicar la lógica opuesta para evitar que el objeto se aleje cuando haya alcanzado una cierta distancia:
if (distanceFromObject < 2) { isCloseEnough = true; } else if (distanceFromObject > SomeValue) { isCloseEnough = false; }Si entiendo correctamente, podría simplemente agregar una bandera bool y configurarla una vez que esté lo suficientemente cerca. Luego, puede comenzar a moverse y omitir más controles de distancia, pero seguir moviéndose para siempre.
private bool flyAway; void Update() { if(!flyAway) { distanceFromObject = Vector3.Distance(character.transform.position, transform.position); print (distanceFromObject); if (distanceFromObject < 2) { flyAway = true; } } else { transform.Rotate (rotateChange); transform.position += positionChange; } } En general: ¡Evite usar print cada cuadro! ¡Incluso si su usuario no ve el registro en una aplicación creada, todavía está causando gastos generales!