Estoy tratando de rotar mi objeto 2d alrededor de mi mouse. Este es el código que tengo:
void Update() { Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); Vector3 direction = mousePosition - transform.position; float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg; transform.rotation = Quaternion.Euler(0, 0, angle); // Debug.Log(angle); }
Mi objeto, que es una flecha, apunta hacia abajo de manera predeterminada, por lo que antes de comenzar el script establecí su rotación z en 90, para que mire hacia la derecha. Si elimino la línea transform.rotation
, el ángulo que se muestra será el correcto, cuando mi cursor está arriba dice 90, a la izquierda dice 180, etc. Entonces mi pregunta es: ¿Por qué necesito agregar 90 grados al ángulo para hacer esto realmente funciona? ¿Por qué no funciona esta versión?
Mathf.Atan2
(Ver también Wikipedia - Atan2 )
El valor de retorno es el ángulo entre el eje x [=
Vector3.right
] y un vector 2D que comienza en cero y termina en (x,y).
Funcionaría como se esperaba si su flecha por defecto apuntara a la derecha pero la suya es
por defecto apuntando hacia abajo
simplemente puede agregar la rotación de compensación en la parte superior como
transform.rotation = Quaternion.Euler(0, 0, angle + 90);
Alternativamente, si necesita esto para múltiples objetos con diferentes compensaciones, use un campo configurable como
[SerializeField] private float angleOffset; ... transform.rotation = Quaternion.Euler(0, 0, angle + angleOffset);
O puede girarlo manualmente para que mire correctamente a la derecha antes de iniciar la aplicación y almacenar esa rotación de desplazamiento predeterminada como
private Quaternion defaultRotation; private void Awake () { defaultRotation = transform.rotation; }
y luego hacer
transform.rotation = defaultRotation * Quaternion.Euler(0, 0, angle);