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

357
Vistas
Unidad 2D. ¿Cómo rotar un objeto suavemente dentro de una rutina?

Soy novato aquí, pero intentaré describirlo lo más claro que pueda. (no es tan importante, solo para aclarar) Entonces, quiero rotar un objeto 405 grados en 1 segundo solo una vez , cuando se presiona el espacio. Pensé que debería hacerse usando rutinas, así que escribí algo como esto:

 private void Update() { if (Input.GetKeyDown(KeyCode.Space)) { StopAllCoroutines(); //to prevent overlapping StartCoroutine(Rotate()); } } IEnumerator Rotate() { //where final finalRotation is a rotation i want to get in a result Quaternion finalRotation = Quaternion.Euler(0, 0, 405) * transform.rotation; /* using do..while to make sure that object will rotate even in case it's in same rotation as finalRotation */ do { //should smoothly rotate an object for 405deg in 1 sec but it doesnt transform.Rotate(Vector3.forward, 405f * Time.deltaTime / 1f); } while (transform.rotation != finalRotation); yield return 1; }

El código anterior funciona bien y todo está bien, excepto uno, gira un objeto al instante y no sin problemas . Quiero decir, si uso esa línea de código en Update, todo sale bien.

 transform.Rotate(Vector3.forward, 405f * Time.deltaTime / 1f);

Entonces mis preguntas:

  1. ¿Por qué gira suavemente en Update, pero instantáneamente en la rutina?

  2. y como se puede arreglar eso?

Gracias de antemano, una vez más, perdón si cometí algunos errores al hacer un tema.

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

0

Se actualiza instantáneamente en la rutina porque solo cedes cuando se completa la rotación. El marco no se renderizará hasta que cada corrutina pendiente/en ejecución ceda o se complete, por lo que aquí se completa la rotación y finalmente se renderiza el fotograma, lo que lo convierte en una rotación instantánea.

En su lugar, debe ceder en el bucle.

También debe tener en cuenta que Quaternion finalRotation = Quaternion.Euler(0, 0, 405) * transform.rotation; y transform.Rotate(Vector3.forward, 405f); puede tener diferentes resultados dependiendo de las rotaciones del objeto principal, porque rotan en diferentes espacios, el primero rotando en global y el segundo rotando en local. Esto puede resultar en que el ciclo, como está escrito, en realidad nunca termine.

Otro problema es que no hay garantía de que la suma de los valores de Time.deltaTime alguna vez sume 1f. Supongamos que en el primer fotograma se produce un retraso, lo que provoca que Time.deltaTime sea enorme, 2f . Puedes ver cómo nunca podría terminar como resultado. Como alternativa, debe recordar la rotación de inicio, luego, en cada cuadro, calcular la rotación de ese cuadro y luego aplicarla a ese cuadro.

En total:

 IEnumerator Rotate() { Quaternion startRotation = transform.rotation; float endZRot = 405f; float duration = 1f; float t = 0; while (t < 1f) { time = Mathf.Min(1f, t + Time.deltaTime/duration); Vector3 newEulerOffset = Vector3.forward * (endZRot * t); // global z rotation transform.rotation = Quaternion.Euler(newEulerOffset) * startRotation; // local z rotation // transform.rotation = startRotation * Quaternion.Euler(newEulerOffset); yield return null; } }
over 4 years ago · Santiago Trujillo Denunciar

0

yield return null esperará un cuadro dentro de una rutina. Ahora mismo has colocado el yield return 1; fuera del bucle while, por lo que no hará nada. En esta situación, me perdería entre las dos rotaciones en un bucle while que va de 0->1

o (si no quiere hacer nada de esto y no le importa un poco la hinchazón) use leantween, https://assetstore.unity.com/packages/tools/animation/leantween-3595

over 4 years ago · Santiago Trujillo Denunciar

0

En el lugar donde lo gira un incremento, debe esperar un tiempo. Tratar

 yield return new WaitForSeconds(0.1);

Además, mientras estaba escribiendo esto, alguien más respondió.

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