Quaternion.identity
Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.
Submission failed
For some reason your suggested change could not be submitted. Please try again in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.
Your name Your email Suggestion * Submit suggestion
Важные классы — Quaternion
Unity использует Quaternion стандартный способ Unity для представления поворотов в виде данных. При написании кода, имеющего дело с поворотами, обычно следует использовать класс Quaternion и его методы. Подробнее
См. в классе Словарь для хранения трехмерной ориентации GameObjects Основной объект в сценах Unity, который может представлять персонажей, реквизит, декорации, камеры, путевые точки и многое другое. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
См. в Словарь , а также использовать их для описания относительного поворота от одного ориентация на другого.
На этой странице представлен обзор класса Quaternion и его частого использования при написании сценариев с его помощью. Исчерпывающую информацию о каждом члене класса Quaternion см. в справочнике по скрипту Quaternion.
Важно понимать разницу между углами Эйлера (значениями X, Y и Z, которые вы видите в инспекторе для поворота GameObject) и базовым значением Quaternion, которое Unity использует для хранения фактического поворота GameObjects. Основы этой темы см. в статье Вращение и ориентация в Unity.
При работе с поворотами в ваших скриптах фрагмент кода, который позволяет создавать собственные компоненты, запускающие игровые события , изменяйте свойства компонента с течением времени и реагируйте на ввод данных пользователем любым удобным для вас способом. Подробнее
См. в Словарь , вы должны использовать класс Quaternion и его функции для создания и изменить значения вращения. В некоторых ситуациях допустимо использование углов Эйлера, но вы должны помнить:
– Вам следует использовать функции класса Quaternion, которые имеют дело с углами Эйлера
— Получение, изменение и повторное применение значений Эйлера из поворота может привести к непреднамеренным побочным эффектам (см. ниже)
Непосредственное создание кватернионов и управление ими
Класс Quaternion в Unity имеет ряд функций, которые позволяют создавать повороты и управлять ими без использования углов Эйлера, и именно эти функции следует использовать в большинстве типичных случаев. Каждая из этих ссылок на Справочник по сценариям с примерами кода:
Создание поворотов:
- Quaternion.LookRotation
- Quaternion.Angle
- Quaternion.AngleAxis
- Quaternion.FromToRotation
Управление поворотами:
- Quaternion.Slerp
- Quaternion.Inverse
- Quaternion.RotateTowards
Класс Transform также предоставляет методы, позволяющие работать с поворотами кватерниона:
Работа с углами Эйлера
В некоторых случаях предпочтительнее использовать в сценариях углы Эйлера. При этом важно помнить, что вы должны хранить свои углы в переменных и использовать их только для применения их в качестве углов Эйлера к вашему повороту, который в конечном итоге все равно должен храниться как кватернион. Хотя можно получить углы Эйлера из кватерниона, при извлечении, изменении и повторном применении могут возникнуть проблемы.
Подробнее о том, как именно могут возникнуть эти проблемы, можно прочитать на справочной странице скриптов eulerAngles.
Вот несколько примеров ошибок, которые обычно делаются на гипотетическом примере попытки повернуть игровой объект вокруг оси X со скоростью 10 градусов в секунду. Вот чего следует избегать:
// rotation scripting mistake #1 // the mistake here is that we are modifying the x value of a quaternion // this value does not represent an angle, and does not produce desired results void Update () < var rot = transform.rotation; rot.x += Time.deltaTime * 10; transform.rotation = rot; >// rotation scripting mistake #2 // Read, modify, then write the Euler values from a Quaternion. // Because these values are calculated from a Quaternion, // each new rotation might return very different Euler angles, which might suffer from gimbal lock. void Update ()
А вот пример использования углов Эйлера в скрипте правильно:
// Rotation scripting with Euler angles correctly. // Store the Euler angle in a class variable, and only use it to // apply it as an Euler angle, but never rely on reading the Euler back. float x; void Update ()
Погружение в скрипты игрового движка Unity3d, ч.1
Доброго времени суток, уважаемый читатель! На Хабре неоднократно публиковались статьи о разработке игр с использованием замечательного движка Unity3d. Большинство этих статей были посвящены вполне определенным задачам, я же хотел сделать общий экскурс в данный движок. Данная часть будет посвящена наиболее часто используемым скриптовым методам и объектам, которые используются мной в процессе разработки на данном движке. Примеры я буду приводить на JavaScript, как на наиболее близком мне языке.
Игровой объект
Создание нового игрового объекта с именем MyObject.
var myObject = new GameObject("MyObject");
Созданный объект будет доступен по ссылку myObject.
Поиск объекта по его имени.
var myObject = GameObject.Find("MyObject");
Теги можно использовать для помечания группы объектов со сходными свойствами, либо использующиеся в единой сцене.
Поиск объекта по тегу, возвращает единственный объект:
var myObject = GameObject.FindWithTag("MyTag");
Возвращает список всех объектов с указанным тегом:
var objectList = GameObject.FindGameObjectsWithTag("MyTag");
Проверка на наличие у объекта требуемого тега. Возвращает true, если у указанного объекта имеется тег MyTag:
var isCompare = GameObject.CompareTag("MyTag");
Destroy(myObject);
Уничтожение объекта через минуту, после его создания:
Destroy(myObject, 60);
Возвращает компонент component, привязанный к объекту GameObject, либо null, если объект не содержит данного компонента. Может использоваться, например, для доступа к другим скриптам, привязанным к объекту.
var objectComponent = GameObject.GetComponent(component);
Возвращает все имеющиеся у объекта компоненты типа componentType.
var objectComponents = GameObject.GetComponents(componentType);
Привязать компонент myComponent к объекту GameObject и получить ссылку на него.
var component = GameObject.AddComponent(myComponent);
Положение игрового объекта
Свойство transform объекта GameObject содержит в себе данные о положении объекта в игровом мире.
Возвращает глобальные координаты объекта в игровом мире. Возвращаемая величина имеет тип Vector3, который представляет из себя список из 3 координат — x, y и z:
var position = GameObject.transform.position; var x = position.x;
Переместить объект в точку 0, 10, 0 игрового мира.
GameObject.transform.position = Vector3(0, 10, 0);
Тоже самое, что и в случае глобальных координат, но с локальными. Локальные координаты расситываются относительно родительского объекта. В случае отсутствия родительского объекта локальные координаты совпадают с глобальными:
var localPosition = GameObject.transform.localPosition; var x = localPosition.x;
Поворот объекта в углах Эйлера. Метод также возвращает координаты в виде объекта Vector3:
var eulerAngle = GameObject.transform.eulerAngles;
Тоже самое, что и предыдущий пример, но поворот объекта рассчитывается относительно родительского объекта:
var localEulerAngle = GameObject.transform.localEulerAngles;
Текущий угол поворота объекта, основанный на кватернионах. Возвращает объект типа Quaternion.
var quaternionAngle = GameObject.transform.rotation;
Текущий поворот объекта, основанный на кватернионах, но относительно родительского объекта:
var localQuaternionAngle = GameObject.transform.localRotation;
Сброс угла поворота объекта:
GameObject.transform.rotation = Quaternion.identity; GameObject.transform.localRotation = Quaternion.identity;
Вращаем наш объект в указанную сторону со скоростью 1 градус в секунду. Принимает в качестве координат объект типа Vector3. Метод deltaTime объекта Time содержит время в секундах, затраченное на выполнение предыдущего кадра:
GameObject.transform.Rotate(Vector3.left * Time.deltaTime);
Тоже самое, что и предыдущий пример, но вращение объекта относительно координат родителя:
GameObject.transform.localRotate(Vector3.left * Time.deltaTime);
Перемещаем наш объект в указанном направлении со скоростью 1 юнит в секунду. Также принимает в качестве координат объект класса Vector3:
GameObject.transform.Translate(Vector3.up * Time.deltaTime);
Физические свойства игрового объекта
Метод rigidbody объекта GameObject хранит в себе его физические свойства. Прежде, чем использовать метод rigidbody, его необходимо добавить к игровому объекту.
Получаем/задаем вектор скорости объекта:
var velocity = GameObject.rigidbody.velocity; GameObject.rigidbody.velocity = Vector3(0, 1, 0);
Сила противодействия объекта. Может использоваться для замедления скорости, в среде с отсутствующей силой трения. Наиболее часто используется для замедления падающих объектов, например при создании парашюта. Принимает в качестве параметра целое число:
GameObject.rigidbody.drag = 100;
Задание массы объекту. Рекомендуется использовать массу в пределах от 0.1 до 10. Использование слишком больших значений может привести к непредсказуемым результатам при расчете физики:
GameObject.rigidbody.mass = 5;
Влияние на объект гравитации. Принимает в качестве параметра булево значение. Позволяет отключить влияние гравитации на отдельные объекты:
GameObject.rigidbody.useGravity = false;
Влияние физики на игровой объект. Позволяет отключить частично, либо полностью влияние физических законов на объект:
GameObject.rigidbody.isKinematic = true;
Запрет на вращение объекта. Наиболее часто используется, когда необходимо сохранить определенный угол поворота даже после столкновения с другими объектами:
GameObject.rigidbody.freezeRotation = true;
Указание координат точки центра массы объекта. Применяет координаты в виде уже знакомого нам объекта Vector3.
GameObject.rigidbody.centerOfMass = Vector3(1, 0, 0);
Использовать ли для объекта обнаружение столкновений с другими объектами. Можно выключить, тогда ваш объект будет игнорировать любые столкновения:
GameObject.rigidbody.detectCollisions = false;
Режим определения столкновений между объектами. Можно указать несколько разных режимов:
CollisionDetectionMode.ContinuousDynamic для быстро движущихся объектов;
CollisionDetectionMode.Continuous для столкновений с быстро движущимися объектами;
CollisionDetectionMode.Discrete (по умолчанию) для обычных столкновений;
В случае отсутствия проблем с определением столкновений рекомендуется использовать свойство по умолчанию.
Задать плотность объекта:
GameObject.rigidbody.SetDensity(1.5);
Применить импульс к объекту с указанным вектором. В результате применения импульса объект придет в движение пропорционально силе импульса.
GameObject.rigidbody.AddForce(5, 0, 0);
Применить импульс к объекту с вектором в его (объекта) системы координат:
GameObject.rigidbody.AddRelativeForce(0, 0, 5);
Добавить объекту крутящий момент. Применение данного метода заставит объект вращаться вокруг своего центра масс GameObject.rigidbody.centerOfMass.
GameObject.rigidbody.AddTorque(0, 1, 0);
Тоже самое, что и предыдущий пример, но относительно координат объекта:
GameObject.rigidbody.AddRelativeTorque (1, 0, 0);
Применение импульса к объекту из внешней указанной точки. Заставляет объект двигаться и вращаться одновременно. Может использоваться, например, для симуляции попадания в объект пули. Первый параметр указывает вектор направления силы, второй параметр — исходную точку направления силы.
GameObject.rigidbody.AddForceAtPosition(Vector3(0, 5, 7), Bomb.transform.position);
Для полноценной симуляции объемных взрывов в Unity3D есть отдельный метод. Первый параметр метода позволяет указать мощность импульса, второй параметр — точку, из которой исходит импульс, третий параметр — радиус распространения импульса, четвертый параметр — модификатор сжатия сферы распространения силы, пятый, необязательный, параметр указывает тип используемого импульса:
GameObject.rigidbody.AddExplosionForce(power, explosionPos, radius, 2.0);
Заставить объект «уснуть», и запретить дальнейший расчет физических показателей для него:
GameObject.rigidbody.Sleep();
Проверить «заснул» ли объект:
GameObject.rigidbody.IsSleeping();
«Разбудить» объект для возможности дальнейшего применения влияния физики на него:
GameObject.rigidbody.WakeUp();
Трассировка лучей
Один из самых часто используемых в разработке на Unity3D объект, это Ray. Данный объект позволяет выпустить луч из указанной точки, в указанном направлении, и вернуть некоторые свойства объектов, которых он смог достичь.
Создаем объект класса RaycastHit, который содержит информацию об объекте, с которым столкнулся луч:
var hit : RaycastHit;
Отправляем луч длиной в 50 юнитов из позиции rayPosition в направлении rayVector, и заносим объект, с которым столкнулся луч в переменную hit:
Physics.Raycast(rayPosition, rayVector.forward, hit, 50);
Получаем дистанцию до объекта, с которым столкнулся луч. Дистанция не может быть больше, чем протяженность луча:
var distance = hit.distance;
Иногда бывает необходимо получить имя объекта, с которым произошло столкновение луча. Наиболее простой способ это сделать:
var objectName = hit.collider.gameObject.name;
Для получения тега объекта используем следующий способ:
var Tag = hit.collider.tag;
Unity3D содержит еще множество различных методов и объектов, полезных и не очень. К сожалению полный их обзор увеличил бы и без того объемную статью, поэтому я постараюсь рассказать об остальном более подробно в будущем, если мне представится такая возможность. Я бы хотел пожелать опытным разработчикам побольше интересных проектов, а начинающим — успехов и интересных открытий. Спасибо, что уделили внимание данной статье.
UPD. вторая часть (скриптовые события).
Помогите разобраться с префабами в unity3D
Помогите!В юнити ,в скрипте я должен в игровом процессе создать префаб,он создаётся,но создаётся не в том месте где я хочу(я имею ввиду не в том месте в иерархии).Например я хочу что бы префабы появлялись в канвасе,или в каком-то объекте,но префабы появляются сами по себе (в иерархии).Так вот,как сделать так чтобы префабы,создавались там ,где я хочу(в любом месте иерархии)?
void OnMouseUpAsButton () < switch (gameObject.name) < case "plus_square": var child = Instantiate (prefab, new Vector3 (0, 0, 0), Quaternion.identity); child.SetParent (parent, false); break; >>
Что не так?Переменные я объявил
Отслеживать
51.2k 86 86 золотых знаков 266 266 серебряных знаков 505 505 бронзовых знаков