Как сделать поворот персонажа в unity 2d
Приветствую всех друзья! В прошлой статье мы подробно рассмотрели предназначение слоев в Unity. Сегодня мы поговорим о представлении вращения и ориентации в пространстве игровых объектов. Это важная информация особенно для новичков - очень многие путаются на начальных этапах именно во вращении игровых объектов.
Вращения в 3D приложениях обычно представляют одним из двух путей: кватернионы ( Quaternions ) или углы Эйлера ( Euler angles ). У каждого из них есть свои преимущества и недостатки. Unity под капотом использует для представления вращений кватернионы, но в инспекторе для удобства показаны значения углов Эйлера, это делает изменение значений в инспекторе более простым и легким для понимания.
Углы Эйлера.
Углы Эйлера представлены тремя значениями углов для осей X, Y и Z которые применяются последовательно. Чтобы применить вращение Эйлера к конкретному игровому объекту Каждое значение вращения применяется поочередно, как вращение вокруг своей соответствующей оси.
У углов Эйлера есть следующие преимущества:
- Они могут представлять собой поворот от одной ориентации к другой через поворот более чем на 180 градусов
Но без недостатков как вы понимаете такой способ представления вращения также не обошелся:
Кватернионы.
Кватернионы могут использоваться для представления ориентации или вращения игровых объектов. Это представление внутри состоит из четырех чисел (в рамках Unity это X, Y, Z и W ) однако эти числа не представляют собой углы или оси, и обычно вам никогда не нужно обращаться к ним напрямую. Если вы не особо заинтересованы в изучении математики кватернионов, то вам действительно нужно знать только одно, что кватернион представляет собой вращение в трехмерном пространстве, и вам никогда нет нужды знать или изменять свойства X, Y, и Z напрямую.
К его сильным сторонам можно отнести:
К слабым можно отнести следующее:
- Один кватернион не может представлять вращение, превышающее 180 градусов в любом направлении.
- Числовое представление кватерниона не является интуитивно понятным.
Unity хранит вращения всех игровых объектов как кватернионы, так как его достоинства перевешивают недостатки.
Компонент Transform отображает в инспекторе вращения с использованием углов Эйлера, поскольку это легче понять и отредактировать. Unity преобразует новые значения в инспекторе для вращения игрового объекта в новые значения вращения кватерниона.
Существует небольшой побочный эффект от таких преобразований, скажем мы ввели в окне инспектора следующие цифры для Rotation X: 0 Y: 375: Z: 0 . Это значение невозможно представить в виде кватерниона, поэтому при запуске игры в инспекторе значения вращения игрового объекта изменятся на X: 0 Y: 15: Z: 0 . Это происходит потому, что Unity преобразует вращение в кватернион, который не имеет понятия полного вращения на 360 градусов плюс 5 градусов, вместо этого он настроен на ориентацию таким же образом, как и результат вращения.
Последствия для написания скриптов.
При работе с обработкой вращений в ваших скриптах, вы должны пользоваться классом Quaternion (о нем еще будет отдельная статья) и его функциями для создания и изменения вращательных значений. Есть некоторые ситуации, когда допустимо использовать углы Эйлера, но вы должны иметь в виду – нужно использовать функции класса Quaternion , которые имеют дела с углами Эйлера. Извлечение, изменение и повторное применение значений углов Эйлера из свойства Rotation компонента Transform может вызвать непреднамеренные побочные эффекты.
Последствия для создания анимации.
Многие программы создания трехмерной графики, а также сам Unity с его окном анимации позволяют использовать углы Эйлера для задания поворотов во время анимации.
Эти значения вращений часто могут превышать диапазоны, выражаемые кватернионами. Например, если игровой объект вращается на 720 градусов, это может быть представлено углами Эйлера как X: 720 Y: 0 Z: 0 . Но это невозможно представить с помощью значения кватерниона.
В собственном окне анимации (о котором еще будет статья) есть опции, которые позволяют указать, как вращение должно быть интерполировано – с помощью интерполяции кватерниона или углов Эйлера. Задавая интерполяцию Эйлера, вы сообщаете Unity, что хотите получить полный диапазон движения, заданный углами. Однако при вращении кватерниона вы говорите, что просто хотите, чтобы вращение закончилось в определенной ориентации, и Unity использует интерполяцию кватерниона и вращается на кратчайшее расстояние, чтобы добраться туда.
При импорте анимаций из внешних источников эти файлы обычно содержат анимацию вращения в формате Эйлера. Поведение Unity по умолчанию заключается в повторной выборке этих анимаций и создании нового ключевого кадра кватерниона для каждого кадра в анимации, чтобы избежать любых ситуаций, когда вращение между ключевыми кадрами может превышать допустимый диапазон кватерниона.
Также есть некоторые ситуации, когда даже при повторной дискретизации – кватернионное представление импортированной анимации не может соответствовать оригиналу достаточно близко, по этой причине в Unity 5.3 и выше есть возможность отключить повторную дискретизацию анимации, так что вы можете вместо этого использовать исходные ключевые кадры анимации Эйлера во время выполнения.
Выделенный пункт позволяет переключаться между дискретизацией в кватернионы или оставить все в формате Эйлера
Выделенный пункт позволяет переключаться между дискретизацией в кватернионы или оставить все в формате Эйлера
На сегодня это все. В следующей статье мы обзорно пройдемся по источникам освещения и камерам в Unity. Спасибо всем, кто дочитал эту статью до конца, подписывайтесь на канал, ставьте лайки, а для тех, у кого появились вопросы - спрашивайте в комментариях! А если вы хотите помочь данному каналу в развитии – делитесь этой статьей с друзьями в социальных сетях!
Я пытаюсь сделать вращающуюся пушку, которая вращается назад и вперед. Я хочу ограничить вращение от -55 до 55 (я имею в виду transform.position.z), но я не могу заставить его работать.
На данный момент мой код:
Единственное, что работает, это первое вращение, которое я сделал для того, чтобы объект начал вращаться, поэтому он просто поворачивается назад и не останавливается, кажется, игнорирует "угол",
Я также пытался поставить последние 2 оператора If, внутри первого, но все еще не работая.
Я хочу заставить его вращаться, пока он не ударит -55, а затем начните вращаться, пока он не достигнет +55, и повторите это.
На нашей сцене уже имеется заготовка персонажа с анимацией, добавим к ней компоненты Box Collider 2d и Rigidbody 2d и настроим компонент так как на скриншоте
Далее создадим скрипт к примеру TransformPlayer с таким кодом:
В этом скрипте указано, что при нажатии на кнопку w значение гравитации у персонажа меняется, а при отпускании, клавиши значение восстанавливается, таким образом, персонажа всегда падать, если не нажимать кнопку w.
Далее, как токового движения вперед у нас не реализовано, но симуляцию движения можно реализовать при помощи фоновых объектов.
Добавим на сцену спрайты земли и продублируем 4 раза, на каждый компонент вешаем те же компоненты Box Collider 2d и Rigidbody 2d, создадим еще один скрипт TransformGround
В этом скрипте, в методе Update реализована функция постоянного движения объекта по оси х , но при столкновении этого объекта с другим, у которого тэг barer, нашему объекту присвоится другая позиция на сцене, таким образом наши 4 объекта земли будут зациклены в движении .
Теперь подробнее… Создадим на камере два пустых объекта, один разместим слева и добавим Box Collider 2d и Rigidbody 2d, так же присвоим ему тэг, который указали в скрипте barer, а другой справа. Примерно так…
Теперь можно поверить запустив игру
Птица управляется, движение земли создает эффект движения птицы. В следующих уроках можно реализовать рандомное появление объектов на сцене и столкновение персонажа с ними. На это все удачных проектов.
Андрей Полковенков
Окей, lookat это хрень ибо я хз как сделать через нее плавный поворот. А вот с lerp я не понял как повернуть объект к другому объекту. Я пытался через looktowards, но там поворот только по x и y. При функции target.transform.position - transform.position и объявлении в Quaternion.Euler объект "А" поворачивается на 0.
Ілля Мельник ответил Андрею
Андрей Полковенков ответил Ілле
Так что ли?
transform.rotation = Quaternion.Lerp(transform.rotation, player.rotation, speed * Time.deltaTime);
Константин Фролов
Андрей Полковенков
Читайте также: