Soy nuevo en el desarrollo de Unity y tengo algunos problemas para rotar GameObjects.
Quiero hacer que el objeto gire -90 grados cada vez que llamas a una función. En este momento puedo hacer que gire alrededor de su eje Y y Z y no hay problema, sin embargo, si cambio los parámetros para que gire alrededor de X se atasca después de girar de -90º (270º en realidad) a 180º.
Aquí está el código que estoy usando para probar:
public class RotateCube : MonoBehaviour { GameObject cube; bool rotating; private void Start() { cube = GameObject.Find("Cube"); rotating = false; } private void Update() { if (!rotating) { StartCoroutine(Rotate()); } } private IEnumerator Rotate() { rotating = true; float finalAngle = SubstractNinety(cube.transform.eulerAngles.x); while (cube.transform.rotation.eulerAngles.x != finalAngle) { cube.transform.rotation = Quaternion.RotateTowards(cube.transform.rotation, Quaternion.Euler(finalAngle, cube.transform.rotation.eulerAngles.y, cube.transform.rotation.eulerAngles.z), 100f * Time.deltaTime); yield return null; } cube.transform.rotation = Quaternion.Euler(finalAngle, cube.transform.rotation.eulerAngles.y, cube.transform.rotation.eulerAngles.z); yield return null; rotating = false; } private float SubstractNinety(float angle) { if (angle < 90) { return 270f; } return angle - 90; } }Estoy actualizando todas las coordenadas en Quaternion.Euler en cada iteración porque quiero que el usuario pueda arrastrar el objeto mientras gira, pero no me importaría si la solución requiere definir Quaternion antes del ciclo.
¿Por qué te molestas en pasar por los eulerAngles ?
Al usar la propiedad
.eulerAnglespara establecer una rotación, es importante comprender que, aunque proporciona valores de rotación X, Y y Z para describir su rotación, esos valores no se almacenan en la rotación. En su lugar, los valores X, Y y Z se convierten al formato interno deQuaternion.Cuando lee la propiedad
.eulerAngles, Unity convierte la representación interna deQuaternionde la rotación en ángulos de Euler. Debido a que hay más de una forma de representar cualquier rotación dada usando ángulos de Euler, los valores que lea de nuevo pueden ser bastante diferentes de los valores que asignó. Esto puede causar confusión si intenta incrementar gradualmente los valores para producir animación .Para evitar este tipo de problemas, la forma recomendada de trabajar con rotaciones es evitar confiar en resultados consistentes al leer
.eulerAnglesparticularmente cuando se intenta incrementar gradualmente una rotación para producir animación. Para obtener mejores formas de lograr esto, consulte el operador Quaternion * .
¡Más bien usa Quaternion directamente! Simplemente agregue la rotación deseada a la existente usando el operador *
using UnityEngine;
using System.Collections;
public class Rotate : MonoBehaviour {
public Space m_RotateSpace;
public float m_RotateSpeed = 20f;
// Update is called once per frame
void Update()
{
transform.Rotate(Vector3.up * m_RotateSpeed * Time.deltaTime, m_RotateSpace);
}
}