unity3d
физика
Компонент Rigidbody дает GameObject физическое присутствие на сцене в том, что он способен реагировать на силы. Вы можете применить силы непосредственно к GameObject или позволить ему реагировать на внешние силы, такие как гравитация, или другой Rigidbody, ударяющий по нему.
Добавление компонента Rigidbody
Вы можете добавить Rigidbody, нажав Component> Physics> Rigidbody
Перемещение объекта Rigidbody
Рекомендуется, если вы примените Rigidbody к GameObject, который использует силы или крутящий момент, чтобы переместить его, а не манипулировать его Transform. Для этого используйте AddForce() или AddTorque() :
масса
Вы можете изменить массу объекта GameGuide, чтобы повлиять на то, как он реагирует на другие Rigidbodies и силы. Более высокая масса означает, что GameObject будет иметь большее влияние на другие основанные на физике GameObjects и потребует большей силы для перемещения. Объекты различной массы будут падать с одинаковой скоростью, если они имеют одинаковые значения перетаскивания. Чтобы изменить массу в коде:
Тащить, тянуть
Чем выше значение перетаскивания, тем больше объект будет замедляться при перемещении. Подумайте об этом как о противостоянии. Чтобы изменить перетаскивание кода:
isKinematic
Если вы отметите Rigidbody как Kinematic, то это не может быть затронуто другими силами, но все равно может повлиять на другие GameObjects. Изменить код:
Ограничения
Также возможно добавить ограничения для каждой оси, чтобы заморозить положение или вращение Rigidbody в локальном пространстве. По умолчанию используется RigidbodyConstraints.None как показано здесь:
Пример ограничений в коде:
Вы можете использовать побитовый оператор OR | для объединения нескольких ограничений:
Столкновения
Если вы хотите, чтобы GameObject с Rigidbody на нем реагировал на столкновения, вам также нужно добавить к нему коллайдер. Типы коллайдера:
- Коллайдер коробки
- Сферный коллайдер
- Капсульный коллайдер
- Коллайдер колес
- Мешевый коллайдер
Если вы применяете несколько коллайдеров к GameObject, мы называем это сложным коллайдером.
Вы можете сделать коллайдер в триггере , чтобы использовать OnTriggerEnter() , OnTriggerStay() и OnTriggerExit() . Триггерный коллайдер физически не реагирует на столкновения, другие GameObjects просто проходят через него. Они полезны для обнаружения, когда другой GameObject находится в определенной области или нет, например, при сборе элемента, мы можем захотеть просто запустить его, но обнаружить, когда это произойдет.
Гравитация в жестком теле
Свойство useGravity RigidBody контролирует, влияет ли на него гравитация или нет. Если установлено значение false RigidBody будет вести себя так, как если бы в космическом пространстве (без постоянной силы, применяемой к нему в некотором направлении).
Это очень полезно в ситуациях, когда вам нужны все другие свойства RigidBody кроме движения, управляемого гравитацией.
Когда включено, на RigidBody будет влиять гравитационная сила, созданная в разделе « Physics Settings :
Гравитация определяется в мировых единицах в секунду в квадрате и вводится здесь как трехмерный вектор: это означает, что с настройками в изображении примера все RigidBodies с свойством useGravity установленным в True будут испытывать силу в 9,81 единиц в секунду в секунду в направлении вниз (как отрицательные значения Y в системе координат Unity вниз).
Rigidbodies, colliders, and triggers for Unity physics
It is reorganized mainly by referring to the following articles in Unity’s official documentation. Docs.unity3d.com/Manual/Phys. Docs.unity3d.com/Manual/clas. Docs.unity3d.com/Manual/clas.
In Unity physics, rigid bodies are used to accept various forces and have speed to control the movement of objects. Collider is used for the interaction and collision between objects, thus affecting the movement of objects. Rigid bodies are often used with colliders to simulate the real world.
The rigid body
- It will be moved by forces like gravity, but it will not be deformed.
- Transform should not be used to move, rotate, and scale objects with rigid bodies. MovePosition, rigidBody. MoveRotation, rigidBody2d. MovePosition, rigidBody2d. MoveRotation should be used to move.
Rigid BodyType BodyType
Rigidbody type is an important property of rigidbody.
- The act of determining movement (position, reversal)
- Determines how collisions interact, if there are collider components
- Changing the BodyType is a performance-intensive operation
There are three types.
Dynamic Dynamic
- The default type
- It’s affected by gravity and additional forces that change its speed.
- The type with the highest performance cost.
- Can be moved by MovePosition, MoveRotation.
- We can use velocity to change speed.
- It’s used to simulate moving objects.
Kinematics of Kinematic
- It’s not affected by the force.
- Performance costs less than Dynamic and more than Static.
- Can be moved by MovePosition MoveRotation.
- We can use velocity to change speed.
- It’s used to simulate things that don’t move most of the time, but very rarely need to move. Such as the door.
Static Static
- The physical system does not calculate the object without being affected by forces.
- The type with the lowest performance cost.
- Cannot be moved by MovePosition MoveRotation.
- You cannot change speed with Velocity.
- To simulate objects that never move.
Set the rigid-body type in Physics2D
The Rigidbody2D component in Physics2D has the BodyType attribute but not the IsKinematic attribute.
- Dynamic: Add Rigidbody2D and set BodyType to Dynamic.
- Kinematic: Added Rigidbody2D and set BodyType to Kinematic.
- Static:
- Add Rigidbody2D and set BodyType to Static.
- There is no Rigidbody2D component, but there is a Collider2D component. Equivalent to having a hidden Static Rigidbody2D.
- It’s easy, you don’t have to add a rigidbody and set the type.
- It’s not as efficient as explicitly adding rigid bodies.
Set the rigidbody type in Physics3D
Rigidbody in Physics3D has an IsKinematic property but no BodyType property.
- Dynamic: Rigidbody is added without selecting IsKinematic.
- Kinematic: Add Rigidbody and select IsKinematic.
- Static: Collider component without Rigidbody.
The collision body
- They collide, and they move because of the collision.
- Defining the shape of this GameObject for collision detection triggers the corresponding collider callback function.
- The collider is invisible, and the shape of the collider does not have to match the shape of the actual mesh.
Corresponding to the three types of rigid bodies, colliders also have three types of colliders depending on the added rigid body type.
unity3d Physics Rigidbodies
The Rigidbody component gives a GameObject a physical presence in the scene in that it is able to respond to forces. You could apply forces directly to the GameObject or allow it to react to external forces such as gravity or another Rigidbody hitting it.
Adding a Rigidbody component
You can add a Rigidbody by clicking Component > Physics > Rigidbody
Moving a Rigidbody object
It is recommended that if you apply a Rigidbody to a GameObject that you use forces or torque to move it rather than manipulating it’s Transform. Use AddForce() or AddTorque() methods for this:
You can alter the mass of a Rigidbody GameObject to affect how it reacts with other Rigidbodies and forces. A higher mass means the GameObject will have more of an influence on other physics-based GameObjects, and will require a greater force to move itself. Objects of differing mass will fall at the same rate if they have the same drag values. To alter mass in code:
The higher the drag value, the more an object will slow down while moving. Think of it like an opposing force. To alter drag in code:
isKinematic
If you mark a Rigidbody as Kinematic then it cannot be affected by other forces but can still affect other GameObjects. To alter in code:
Constraints
It is also possible to add constraints to each axis to freeze the Rigidbody’s position or rotation in local space. The default is RigidbodyConstraints.None as shown here:

An example of constraints in code:
You can use the bitwise OR operator | to combine multiple constraints like so:
Collisions
If you want a GameObject with a Rigidbody on it to respond to collisions you will also need to add a collider to it. Types of collider are:
- Box collider
- Sphere collider
- Capsule collider
- Wheel collider
- Mesh collider
If you apply more than one collider to a GameObject, we call it a Compound collider.
You can make a collider into a Trigger in order to use the OnTriggerEnter() , OnTriggerStay() and OnTriggerExit() methods. A trigger collider will not physically react to collisions, other GameObjects simply pass through it. They are useful for detecting when another GameObject is in a certain area or not, for example, when collecting an item, we may want to be able to just run through it but detect when this happens.
Погружение в скрипты игрового движка Unity3d, ч.1
Создание нового игрового объекта с именем MyObject.
Созданный объект будет доступен по ссылку myObject.Поиск объекта по его имени.
Теги можно использовать для помечания группы объектов со сходными свойствами, либо использующиеся в единой сцене.
Поиск объекта по тегу, возвращает единственный объект:Возвращает список всех объектов с указанным тегом:
Проверка на наличие у объекта требуемого тега. Возвращает true, если у указанного объекта имеется тег MyTag:
Уничтожение объекта через минуту, после его создания:
Возвращает компонент component, привязанный к объекту GameObject, либо null, если объект не содержит данного компонента. Может использоваться, например, для доступа к другим скриптам, привязанным к объекту.
Возвращает все имеющиеся у объекта компоненты типа componentType.
Привязать компонент myComponent к объекту GameObject и получить ссылку на него.
Положение игрового объекта
Свойство transform объекта GameObject содержит в себе данные о положении объекта в игровом мире.
Возвращает глобальные координаты объекта в игровом мире. Возвращаемая величина имеет тип Vector3, который представляет из себя список из 3 координат — x, y и z:
Переместить объект в точку 0, 10, 0 игрового мира.
Тоже самое, что и в случае глобальных координат, но с локальными. Локальные координаты расситываются относительно родительского объекта. В случае отсутствия родительского объекта локальные координаты совпадают с глобальными:
Поворот объекта в углах Эйлера. Метод также возвращает координаты в виде объекта Vector3:
Тоже самое, что и предыдущий пример, но поворот объекта рассчитывается относительно родительского объекта:
Текущий угол поворота объекта, основанный на кватернионах. Возвращает объект типа Quaternion.
Текущий поворот объекта, основанный на кватернионах, но относительно родительского объекта:
Сброс угла поворота объекта:
Вращаем наш объект в указанную сторону со скоростью 1 градус в секунду. Принимает в качестве координат объект типа Vector3. Метод deltaTime объекта Time содержит время в секундах, затраченное на выполнение предыдущего кадра:
Тоже самое, что и предыдущий пример, но вращение объекта относительно координат родителя:
Перемещаем наш объект в указанном направлении со скоростью 1 юнит в секунду. Также принимает в качестве координат объект класса Vector3:
Физические свойства игрового объекта
Метод rigidbody объекта GameObject хранит в себе его физические свойства. Прежде, чем использовать метод rigidbody, его необходимо добавить к игровому объекту.
Получаем/задаем вектор скорости объекта:
Сила противодействия объекта. Может использоваться для замедления скорости, в среде с отсутствующей силой трения. Наиболее часто используется для замедления падающих объектов, например при создании парашюта. Принимает в качестве параметра целое число:
Задание массы объекту. Рекомендуется использовать массу в пределах от 0.1 до 10. Использование слишком больших значений может привести к непредсказуемым результатам при расчете физики:
Влияние на объект гравитации. Принимает в качестве параметра булево значение. Позволяет отключить влияние гравитации на отдельные объекты:
Влияние физики на игровой объект. Позволяет отключить частично, либо полностью влияние физических законов на объект:
Запрет на вращение объекта. Наиболее часто используется, когда необходимо сохранить определенный угол поворота даже после столкновения с другими объектами:
Указание координат точки центра массы объекта. Применяет координаты в виде уже знакомого нам объекта Vector3.
Использовать ли для объекта обнаружение столкновений с другими объектами. Можно выключить, тогда ваш объект будет игнорировать любые столкновения:
Режим определения столкновений между объектами. Можно указать несколько разных режимов:
CollisionDetectionMode.ContinuousDynamic для быстро движущихся объектов;
CollisionDetectionMode.Continuous для столкновений с быстро движущимися объектами;
CollisionDetectionMode.Discrete (по умолчанию) для обычных столкновений;
В случае отсутствия проблем с определением столкновений рекомендуется использовать свойство по умолчанию.Задать плотность объекта:
Применить импульс к объекту с указанным вектором. В результате применения импульса объект придет в движение пропорционально силе импульса.
Применить импульс к объекту с вектором в его (объекта) системы координат:
Добавить объекту крутящий момент. Применение данного метода заставит объект вращаться вокруг своего центра масс GameObject.rigidbody.centerOfMass.
Тоже самое, что и предыдущий пример, но относительно координат объекта:
Применение импульса к объекту из внешней указанной точки. Заставляет объект двигаться и вращаться одновременно. Может использоваться, например, для симуляции попадания в объект пули. Первый параметр указывает вектор направления силы, второй параметр — исходную точку направления силы.
Для полноценной симуляции объемных взрывов в Unity3D есть отдельный метод. Первый параметр метода позволяет указать мощность импульса, второй параметр — точку, из которой исходит импульс, третий параметр — радиус распространения импульса, четвертый параметр — модификатор сжатия сферы распространения силы, пятый, необязательный, параметр указывает тип используемого импульса:
Заставить объект «уснуть», и запретить дальнейший расчет физических показателей для него:
Проверить «заснул» ли объект:
«Разбудить» объект для возможности дальнейшего применения влияния физики на него:
Трассировка лучей
Один из самых часто используемых в разработке на Unity3D объект, это Ray. Данный объект позволяет выпустить луч из указанной точки, в указанном направлении, и вернуть некоторые свойства объектов, которых он смог достичь.
Создаем объект класса RaycastHit, который содержит информацию об объекте, с которым столкнулся луч:
Отправляем луч длиной в 50 юнитов из позиции rayPosition в направлении rayVector, и заносим объект, с которым столкнулся луч в переменную hit:
Получаем дистанцию до объекта, с которым столкнулся луч. Дистанция не может быть больше, чем протяженность луча:
Иногда бывает необходимо получить имя объекта, с которым произошло столкновение луча. Наиболее простой способ это сделать:
Для получения тега объекта используем следующий способ:
Unity3D содержит еще множество различных методов и объектов, полезных и не очень. К сожалению полный их обзор увеличил бы и без того объемную статью, поэтому я постараюсь рассказать об остальном более подробно в будущем, если мне представится такая возможность. Я бы хотел пожелать опытным разработчикам побольше интересных проектов, а начинающим — успехов и интересных открытий. Спасибо, что уделили внимание данной статье.