Использование Rigidbody в Unity. #17

Unity    2018-03-10 15:55:40     тег: Курс по Unity

В этом уроке вы узнаете основные приемы работы с компонентом RigidBody. Данный компонент придает объекту физические свойства схожие с объектами в реальном мире. Это может быть например гравитация, скольжение, масса, столкновение.

К этому уроку я подготовил ассет который представляет собой сцену с ландшафтом на котором в загородке находится несколько бочек. Эти бочки будут необходимы нам для того, чтобы показать симуляцию физики в Unity. 

Чтобы объект обладал физическими свойствами, к нему необходимо добавить компонент Rigidbody. Чтобы его добавить выберете все бочки на вкладке Hierarchy и нажмите кнопку Add Component > Physics > Rigidbody.

Обратите внимание, что у бочек присутствует компонент Capsule Collider. Как вы знаете из прошлого урока, коллайдер создает у объекта невидимые границы, которые не дают проходить объектам сквозь друг друга, и сейчас они практически повторяют форму бочку.

Для начала рассмотрим как компонент Rigidbody работает с настройками по умолчанию. Нажмите кнопку Play, и на вкладке Game вы увидите как бочки падают вниз.

Как вы наверно обратили внимание бочки не выпадают за границу забора, так как у забора также есть коллайдер, который не позволяет выйти за его границы.

После того как объект переходит в состояние покоя, Unity включает у компонента Rigidbody так называемый режим Sleep Mode. 

В этом режиме движок обрабатывающий физику перестает использовать вычислительную мощность на отслеживание объекта, тем самым оптимизируя симуляцию физики в игре.

Теперь рассмотрим компонент RigidBody более подробно. Свойство Mass представляет собой массу объекта в килограммах, именно так утверждает официальная документация.

Стоит также знать, что несмотря на массу объекта, сталкиваться между собой могут только объекты которые имеют компонент Rigidbody. 

Свойство Drag симулирует сопротивление ветра. Это значит, что объект у которого значение Drag установлено в 10, будет падать медленнее других объектов за счет сопротивления воздуха. 

На сцене есть отдельная бочка. Установите значение свойства Drag в 10 и запустите игровую среду на выполнение. Как вы видите бочка падает медленнее.

Вернем значение 0 и рассмотрим свойство Angular Drag, это свойство схоже с предыдущим, однако сопротивление воздуха действует только когда объект вращается. 

Чем больше значение, тем быстрее будет происходить затухание объекта после того как он начал вращаться. Установите значение в 5 и запустите среду на выполнение. Как вы видите бочка упав практически не вращается, верните значение в 0,1 и повторите эксперимент.

Теперь поговорим о свойстве Use Gravity. Название этого свойства говорит само за себя. Оно определяет, будет ли объект подвержен силам гравитации или нет. Настройка гравитации выставляются в настройках проекта. 

Зайдите в настройки физики открыв меню Edit > Project Settings > Physics. Самое первое свойство Gravity отвечает за гравитацию или другими словами за силу тяжести. 

Как вы можете видеть ось Y установлена в значение -9.81, что соответствует силе тяжести земной гравитации. Если увеличить отрицательное значение, объекты будут падать быстрее. 

А если вы установите это значение в 0, то гравитация будет совсем отсутствовать.  Если больше нуля - предметы начнут улетать в противоположном направлении.

Устанавливая значения по другим осям, предметы будут соответственно перемещаться вдоль этих осей.

Зачастую изменение силы тяжести используется в платформерах когда надо сделать, чтобы персонаж падал быстрее.

Вернемся к нашим бочкам и посмотрим на свойство Is Kinematic. Это свойство позволяет включить или выключить воздействие физики на объект. 

Ни гравитация, ни столкновения, никакие другие физические свойства не будут на него действовать, при том, что другие объекты, будут по-прежнему с ним взаимодействовать.

Давайте у объекта Barrel_LP (24) включим свойство Is Kinematic, и запустим среду на выполнение. Как вы видите этот объект остался на месте, так как на него не воздействует сила тяжести, также бочка не подвержена ударам других объектов по ней, в отличии от других бочек которые с ней столкнулись. 

Тем не менее этим объектом можно управлять используя скрипты, например изменить его позицию или выключить свойство Is Kinematic.

Следующее свойство которое мы рассмотрим - Interpolate. Данное свойство сглаживает рывки объекта, которым управляют из скрипта, при наличии у него компонента Rigidbody.

Как правило интерполяция используется, когда вы управляете персонажем, то есть объектом, используя интерфейс ввода/вывода - Input, который подключает клавиши WASD для управляет персонажем. 

Во время управления персонажем, компонент Rigidbody применяет к нему гравитацию, толкая его постоянно вниз по оси Y при этом создавая небольшие рывки.

Свойство Interpolate установленное в одноименное значение проверяет предыдущий кадр и на его основе сглаживает движение в текущем кадре. 

Если же оно установлено в Extrapolate, то движок пытается предугадать следующий кадр и на его основе сгладить движение в настоящем кадре.

Для получения нужного эффекта необходимо экспериментировать с этими значениями. Также знайте, что свойство Interpolate не всегда может решить проблему, однако иногда это может помочь.

Теперь поговорим о свойстве Collision Detection. Это свойство помогает при настройке объектов движущихся с большой скоростью. 

Рассмотрим это на конкретном примере. Возьмите бочку и поднимите ее на высоту 200 метров по оси Y, и установите ее массу 1000 кг.

Запустите игру и дождитесь пока бочка упадет. Она упадет на горизонтальный забор и ничего сверхестественного не произойдет. Теперь установите значение оси Y равным 200.7 метра, и снова запустите игру.

Теперь бочка пролетела сквозь забор и упала на Terrain. С данной проблемой сталкиваются многие начинающие разработчики создавая выстрелы, когда пуля пролетает сквозь врага не задевая его. И это может стать настоящей проблемой, если не знать ее источник.

Давайте разберемся, что происходит. Бочка падая имитирует физику каждый физический кадр. Важно знать, что частота физических кадров отличается от частоты кадров экрана. 

В игре, где физические кадры хоть и обновляются очень быстро, все же существует небольшая задержка между ними, и бочка при столкновение с коллайдером забора, как раз попала в эту небольшую задержку, что привело к игнорированию коллайдера и прохождению ее через него. 

А с коллайдером объекта Terrain, бочка столкнулась во время обновления физического кадра, поэтому она и не пролетела сквозь него.

Чтобы решить данную проблему, нужно свойство Collision Detection установить в значение Continuous, в этом случае опрос кадров будет происходить чаще и объект не будет пропущен.

Но иногда объект все же может быть настолько быстрым, что может потребоваться использовать значение Continuous Dynamic.

Оно отличается от Continuous тем, что частота  проверки столкновений происходит еще чаще. Однако использование Continuous или Continuous Dynamic потребляет значительное количество вычислительных мощностей устройства.

Поэтому нужно стараться использовать значение Discrete, где только это возможно. Существует достаточно мало ситуаций в которых нужно использовать Continuous или Continuous Dynamic.

Также стоит знать, что на прохождение объекта сквозь коллайдер влияет влияет толщина коллайдера, масса летящего объекта и его скорость.

Следующее что мы рассмотрим, это раздел Constraints. И его свойства Freeze Position и Freeze Rotation. Данные свойства накладывают ограничения на перемещения и вращения объекта по определенным осям.

Выберете бочку и активируйте ось Y свойства Freeze Position, после чего запустите игру. 

Как вы видите бочка не падает, так как мы заморозили ее перемещение по оси Y. Если вы деактивировать ось, бочка продолжит падать, активируете обратно и она опять остановится.

Аналогичным образом работает и вращение. Выберите бочку которая скатывается с поверхности и заморозьте оси вращения, например ось Y, таким образом бочка перестанет вращаться.

Теперь вы знаете что из себя представляет компонент Rigidbody.