Estoy tratando de que un objeto oscile entre -45 y 45 grados, y el siguiente es el código que estoy usando. Tenga en cuenta que la direction se inicializa en 1, zRotation en 360 y la speed en 100. Esto funciona perfectamente bien. Sin embargo, cuando cambio la speed a 1000, el objeto realiza una rotación completa de 360 antes de continuar oscilando correctamente. Estoy confundido por qué sucede eso.
Este es mi código (dentro del método de Update ):
zRotation += speed * Time.deltaTime * direction; var newRotation = Quaternion.Euler( new Vector3( 0, 0, zRotation)); if (zRotation < 315) direction = 1; if (zRotation > 405) direction = -1; transform.rotation = newRotation;Estoy usando los valores 315 (-45 grados) y 405 (45 grados) porque es más fácil determinar si mi objeto ha alcanzado los -45 y 45 grados de esta manera.
Soy consciente de que este comportamiento se puede lograr de manera fácil y más limpia usando Lerp, pero esto es para una tarea y aún no hemos cubierto Lerp, por lo que no quiero usar material que aún no se haya enseñado.
El problema es que no limita los valores de zRotation entre sus valores deseados. En el estado actual de su código, solo confía en que su computadora sea rápida y tenga pocos valores Time.deltaTime (el tiempo transcurrido desde el último cuadro). Si tiene algún tipo de contratiempo (lo que sucede a menudo en los primeros fotogramas después del inicio), el valor de Time.deltaTime será relativamente grande, lo que dará como resultado una zRotation tan grande que tardará más en volver al [-45...45] rango. Puede verificar esto agregando una línea de
Debug.Log($"Time: {Time.deltaTime} - Rotation: {zRotation}");
a su método de actualización.
De esta forma puede ocurrir el siguiente escenario (cada línea es el registro de un cuadro):
En el último paso, había un valor deltaTime que era tan grande que hizo que zRotation se soltara y se alejara mucho del rango deseado. Si limita los valores de rotación con
zRotation = Mathf.Min(Mathf.Max(zRotation, 315), 405);
No te saldrías del rango deseado. (Por supuesto, debe actualizar sus declaraciones if de < a <= o podría dejar algún tipo de umbral en la parte Min(Max()) .
También le aconsejaría que use el operador de módulo ( % ) e inicialice el valor de zRotation en 0 para que no tenga que realizar un seguimiento constante de los valores de 360-minAngle, 360+minAngle, podría simplemente usar los ángulos en un mucho más fácil y el operador de módulo lo ayuda a permanecer en el rango [-360...360].
Actualicé tu código:
public class Rotator : MonoBehaviour { private float direction = 1; private float zRotation = 0; // zRotation initialized to 0 instead of 360 public float speed = 1000; void Update() { zRotation += (speed * Time.deltaTime * direction) % 360; // Use of the modulo operator zRotation = Mathf.Min(Mathf.Max(zRotation, -45), 45); // Limiting the angles so the object does not 'spin out' //If you want to see what's going on in the log Debug.Log($"Time: {Time.deltaTime} - Rotation: {zRotation}"); var newRotation = Quaternion.Euler( new Vector3( 0, 0, zRotation)); if (zRotation <= -45) // LTE because of the limitation to -45 direction = 1; if (zRotation >= 45) /// GTE because of the limitation to 45 direction = -1; transform.rotation = newRotation; } }