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

230
Vistas
Rotar un objeto entre -45 y 45 grados no se comporta como se esperaba

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.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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

  1. Tiempo: 0 - Rotación: 360
  2. Tiempo: 0,02 - Rotación: 380
  3. Tiempo: 0,02 - Rotación: 420
  4. Tiempo: 0,333 - Rotación: 733,33

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; } }
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