Ángulos de Euler
Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 42 de 71.
transform.eulerAngles es la rotación de un objeto expresada como tres ángulos en grados alrededor de x, y y z. Unity almacena la rotación como un cuaternión (en la próxima lección) y vuelve a calcular los tres ángulos cada vez que los lees, siempre como valores de 0 a 360. Inclina una tabla -10 grados alrededor de z y vuelve a leer el valor:
transform.rotation = Quaternion.Euler(0, 0, -10);
Debug.Log(transform.eulerAngles.z); // 350Estableces -10, pero el código lee 350, así que if (transform.eulerAngles.z < -5) nunca es verdadero. Al volver a leerlos, los tres números pueden cambiar: estableces (100, 0, 0) y lees (80, 180, 180), la misma orientación expresada de otra manera. Quaternion.Euler(x, y, z) funciona en la dirección contraria y acepta cualquier ángulo: -10, 350 y 710 producen la misma rotación. Así que guarda el ángulo en un float propio, cámbialo y limítalo allí, y establece la rotación completa a partir de él. Este balancín se inclina con las flechas y se detiene a 20 grados en cualquiera de las dos direcciones:
public float speed = 40f;
float tilt;
void Update()
{
tilt += Input.GetAxisRaw("Horizontal") * speed * Time.deltaTime;
tilt = Mathf.Clamp(tilt, -20f, 20f);
transform.rotation = Quaternion.Euler(0, 0, tilt);
}No cambies una de las partes de los ángulos que lees. transform.eulerAngles.x = 110; no compila (CS1612, igual que con position.x), y copiar eulerAngles, cambiar x y volver a asignar la copia parte de la versión de los ángulos de Unity. Después de establecer (100, 0, 0), esa copia es (80, 180, 180); suma 10 a x y obtienes (90, 180, 180), lo que devuelve el objeto a 90 en lugar de llevarlo a 110.
Desafío
IntermedioCorrige el barrido de la cámara: gira de vuelta al llegar a 45, pero no al llegar a -45, porque eulerAngles.y interpreta -45 como 315.
- Añade un campo
float angle;y sustituye las dos primeras líneas deUpdate()porangle += direction * speed * Time.deltaTime;. - Conserva las dos líneas
ify luego establece la rotación completa:transform.rotation = Quaternion.Euler(tilt, angle, 0);.
Pulsa «Jugar»: la cámara barre de 45 a -45 y vuelve, inclinada hacia abajo. Después, pulsa «Comprobar».
Pruébalo tú mismo
using UnityEngine;
public class Sweep : MonoBehaviour
{
public float speed = 30f;
public float limit = 45f;
public float tilt = 20f; // grados hacia abajo, alrededor de x
float direction = 1f;
void Update()
{
transform.Rotate(0, direction * speed * Time.deltaTime, 0, Space.World);
float angle = transform.eulerAngles.y;
if (angle > limit) direction = -1f;
if (angle < -limit) direction = 1f;
}
}
Todas las lecciones de Física y jugabilidad
1Cuerpo rígido
Gravedad y masaEmpujar con AddForceSaltar con un impulsoFixedUpdate para físicaVelocidadCuerpos cinemáticosRepaso: plataforma de lanzamiento4Corrutinas
InvocarInvokeRepeating y CancelInvokeTu primera corrutinaBucles en corrutinasDetener corrutinasRepaso: cuenta regresiva10Proyecto: Escape de la arena
La arenaCazadores2Colisiones
OnCollisionEnter¿Qué golpeé?Romper al impactarDe pie sobre el sueloRebote y fricciónFormas de los collidersRepaso: muro destructible5Proyecto: Carrera de Monedas
La pelota rodanteMonedas para recoger3Disparadores
Colisionadores de tipo triggerOnTriggerEnterObjetos coleccionablesLas cajas guardan el restoZonas letalesEntrada y salidaRepaso: llave y puertaPractica por tu cuenta: Playground de Unity