Ângulos de Euler
Parte da seção Física e Jogabilidade do Journey de Unity da Coddy. Lição 42 de 71.
transform.eulerAngles é a rotação de um objeto expressa por três ângulos em graus, em torno dos eixos 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 sempre 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); // 350Você 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 geram a mesma rotação. Portanto, mantenha o ângulo em um float próprio, altere-o e limite-o ali, e defina a rotação inteira a partir dele. Esta gangorra inclina com as setas e para em 20 graus para qualquer um dos lados:
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 das partes 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 com a versão dos ângulos do Unity. 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 para 90 em vez de avançar até 110.
Desafio
MédioCorrija o movimento de varredura da câmera: ela volta ao chegar a 45, mas não a -45, porque eulerAngles.y lê -45 como 315.
- Adicione um campo
float angle;e substitua as duas primeiras linhas deUpdate()porangle += direction * speed * Time.deltaTime;. - Mantenha as duas linhas
ife, em seguida, defina a rotação completa:transform.rotation = Quaternion.Euler(tilt, angle, 0);.
Pressione “Jogar”: a câmera faz uma varredura de 45 a -45 e volta, inclinada para baixo. Depois, pressione “Verificar”.
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;
}
}
Todas as lições de Física e Jogabilidade
1Rigidbody
Gravidade e MassaEmpurrar com AddForcePular com um ImpulsoFixedUpdate para FísicaVelocidadeCorpos CinemáticosRevisão: Plataforma de Lançamento4Corrotinas
InvocarInvocar repetidamente, Cancelar invocaçãoSua primeira corrotinaLoops em corrotinasInterrompendo corrotinasRevisão: contagem regressiva10Projeto: Fuga da Arena
A ArenaCaçadores2Colisões
OnCollisionEnterO que eu acertei?Quebre no impactoNo chãoQuique e atritoFormas dos collidersRevisão: Parede destrutível5Projeto: Corrida das Moedas
A Bola RolanteMoedas para ColetarPratique por conta própria: Playground de Unity