Углы Эйлера
Часть раздела Физика и игровой процесс путешествия по 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.
Задание
СреднеИсправь движение камеры: она поворачивает обратно при 45, но не при -45, потому что eulerAngles.y считывает -45 как 315.
- Добавь поле
float angle;и замени первые две строкиUpdate()наangle += direction * speed * Time.deltaTime;. - Оставь две строки
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;
}
}
Все уроки раздела Физика и игровой процесс
1Твёрдое тело
Гравитация и массаТолкаем с помощью AddForceПрыжок с импульсомFixedUpdate для физикиСкоростьКинематические телаПовторение: пусковая площадка4Корутины
InvokeInvokeRepeating, CancelInvokeВаша первая корутинаЦиклы в корутинахОстановка корутинПовторение: обратный отсчёт10Проект: Побег с арены
АренаОхотники2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Монетная гонка
Катящийся шарСобираем монетыПотренируйтесь самостоятельно: Песочница Unity