Menu
CoddyTech

Ângulos de Euler

Parte da seção Física e jogabilidade do Journey de Unity da Coddy. Lição 40 de 63.

transform.eulerAngles é a rotação de um objeto expressa como três ângulos em graus, em torno de x, y e z. O Unity armazena a rotação como um quaternion (na próxima lição) e calcula novamente os três ângulos toda vez que você os lê, sempre como valores de 0 a 360. Incline uma prancha em -10 graus em torno de z e leia o valor de volta:

transform.rotation = Quaternion.Euler(0, 0, -10);
Debug.Log(transform.eulerAngles.z);   // 350

Você definiu -10, mas o código lê 350, então if (transform.eulerAngles.z < -5) nunca é verdadeiro. A leitura de volta pode alterar os três números: defina (100, 0, 0) e você lerá (80, 180, 180), a mesma orientação escrita de outra forma. Quaternion.Euler(x, y, z) faz o caminho inverso e aceita qualquer ângulo: -10, 350 e 710 produzem a mesma rotação. Portanto, mantenha o ângulo em um float próprio, altere-o e limite-o ali, e defina a rotação completa a partir dele. Esta gangorra se inclina com as setas e para em 20 graus em qualquer direção:

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);
}

Não altere uma parte dos ângulos que você lê. transform.eulerAngles.x = 110; não compila (CS1612, assim como position.x), e copiar eulerAngles, alterar x e atribuir a cópia de volta começa pela versão do Unity dos ângulos. Depois de definir (100, 0, 0), essa cópia é (80, 180, 180); some 10 a x e você obterá (90, 180, 180), o que faz o objeto voltar a 90 em vez de avançar para 110.

challenge icon

Desafio

Médio

A câmera de segurança no poste deve oscilar de um lado para o outro continuamente: partindo da posição voltada para a frente (0 graus em torno de y), ela vira à direita, com y aumentando, à speed (30) graus por segundo, volta ao atingir limit (45), oscila até -limit (-45), volta novamente e assim por diante. Durante todo o movimento, ela mantém a inclinação para baixo de tilt (20) graus em torno de x.

Pressione Play: o script inicial volta ao atingir 45, mas, em -45, continua girando. Descubra o motivo e corrija o script; em seguida, pressione Check.

Experimente você mesmo

using UnityEngine;

public class Sweep : MonoBehaviour
{
    public float speed = 30f;
    public float limit = 45f;
    public float tilt = 20f;   // graus para baixo, em torno 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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Física e jogabilidade