Menu
CoddyTech

Á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);   // 350

Estableces -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.

challenge icon

Desafío

Intermedio

La 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;
    }
}
quiz iconPonte a prueba

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