Углы Эйлера
Часть раздела Физика и игровой процесс путешествия по 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.
Задание
СреднеКамера наблюдения на столбе должна непрерывно поворачиваться из стороны в сторону: от положения прямо вперёд (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;
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Физика и игровой процесс
1Твёрдое тело
Гравитация и массаТолкаем с помощью AddForceПрыжок с импульсомFixedUpdate для физикиСкоростьКинематические телаПовторение: пусковая площадка2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Погоня за монетами
Катящийся мячМонеты для сбора