Menu
CoddyTech

Углы Эйлера

Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 42 из 71.

transform.eulerAngles — это поворот объекта, заданный тремя углами в градусах вокруг осей x, y и z. Unity хранит поворот в виде кватерниона (о нём — в следующем уроке) и каждый раз, когда вы считываете углы, вычисляет их заново, всегда возвращая значения от 0 до 360. Наклоните доску на -10 градусов вокруг оси z и считайте угол обратно:

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

Вы задали -10, но код считывает 350, поэтому условие if (transform.eulerAngles.z < -5) никогда не будет истинным. При считывании обратно все три числа могут измениться: задайте (100, 0, 0), а считаете (80, 180, 180) — это та же ориентация, представленная иначе. Quaternion.Euler(x, y, z) работает в обратном направлении и принимает любой угол: -10, 350 и 710 задают один и тот же поворот. Поэтому храните угол в собственном float, изменяйте и ограничивайте его там, а затем задавайте на его основе весь поворот. Эти качели наклоняются при нажатии клавиш со стрелками и останавливаются на 20 градусах в обе стороны:

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

Не изменяйте по отдельности считанные углы. transform.eulerAngles.x = 110; не скомпилируется (CS1612, как и position.x), а если скопировать eulerAngles, изменить x и присвоить копию обратно, отсчёт начнётся от версии углов, рассчитанной Unity. После задания (100, 0, 0) эта копия будет равна (80, 180, 180); прибавьте 10 к x — и получите (90, 180, 180), что повернёт объект обратно до 90, а не дальше до 110.

challenge icon

Задание

Средне

Исправь движение камеры: она поворачивает обратно при 45, но не при -45, потому что eulerAngles.y считывает -45 как 315.

  1. Добавь поле float angle; и замени первые две строки Update() на angle += direction * speed * Time.deltaTime;.
  2. Оставь две строки if, затем задай вращение целиком: transform.rotation = Quaternion.Euler(tilt, angle, 0);.

Нажми «Играть»: камера перемещается от 45 до -45 и обратно, наклонённая вниз. Затем нажми «Проверить».

Попробуйте сами

using UnityEngine;

public class Sweep : MonoBehaviour
{
    public float speed = 30f;
    public float limit = 45f;
    public float tilt = 20f;   // градусов вниз, вокруг оси 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;
    }
}

Все уроки раздела Физика и игровой процесс

Потренируйтесь самостоятельно: Песочница Unity