Ángulos de Euler
Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 40 de 63.
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 siguiente 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 true. Al volver a leer los valores, 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 opuesta y acepta cualquier ángulo: -10, 350 y 710 generan la misma rotación. Así que guarda el ángulo en un float propio, cámbialo y limítalo ahí, y establece toda la rotación a partir de él. Esta balancín se inclina con las flechas y se detiene a 20 grados en cada dirección:
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 parte de los ángulos que lees. transform.eulerAngles.x = 110; no compila (CS1612, como ocurre con position.x), y copiar eulerAngles, cambiar x y asignar la copia de nuevo 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
IntermedioLa cámara de seguridad del poste debería barrer de lado a lado continuamente: desde apuntar hacia delante (0 grados alrededor de y), gira a la derecha, con y aumentando, a speed (30) grados por segundo, vuelve al llegar a limit (45), barre hasta -limit (-45), vuelve de nuevo, y así sucesivamente. Durante todo el tiempo mantiene su inclinación hacia abajo de tilt (20) grados alrededor de x.
Pulsa Play: el código inicial vuelve al llegar a 45, pero al llegar a -45 sigue girando. Averigua por qué y corrige el script; después pulsa Check.
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;
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
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 lanzamiento2Colisiones
OnCollisionEnter¿Qué golpeé?Romper al impactarDe pie sobre el sueloRebote y fricciónFormas de los collidersRepaso: muro destructible5Proyecto: Carrera de monedas
La bola rodanteMonedas para recoger