Menu
CoddyTech

Углы Эйлера

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

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

Задание

Средне

Камера наблюдения на столбе должна непрерывно поворачиваться из стороны в сторону: от положения прямо вперёд (0 градусов вокруг y) она поворачивает вправо, увеличивая y, со скоростью speed (30) градусов в секунду, разворачивается на limit (45), поворачивает обратно до -limit (-45), снова разворачивается и так далее. Всё это время она сохраняет наклон вниз на tilt (20) градусов вокруг x.

Нажми Play: стартовый скрипт разворачивается на 45, но на -45 продолжает вращаться дальше. Выясни почему и исправь скрипт, затем нажми Check.

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

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;
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

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