В этой статье попробуем разобрать, что из себя представляют 2D джоинты, для чего они нужны и какие физические конструкции можно собирать с их помощью.
Джоинты
2D джоинты представляют собой обычные физические объекты, которым можно придавать силу, перемещать, бросать сталкивать и тд, в общем – делать все то, что мы обычно делаем с физическими объектами в Unity. Особенность же джоинтов в том, что с их помощью можно создавать связи с другими физическими объектами на сцене. В этом случае все действия, которые мы совершаем над одним объектом, будут также влиять на другие – связанные с ним объекты.
Все компоненты джоинтов можно найти во вкладке Component -> Physics 2D.
В отличие от джоинтов для 3D физики, джоинтов для 2D физики почти в два раза больше и каждый тип служит для своих целей, хотя принцип работы у них всех практически один и тот же.
Как это работает
Давайте взглянем на изображение ниже, где показаны общие для всех джоинтов настройки компонента.
Первое на что стоит обратить внимание это то, что все джоинты, при создании на сцене автоматически подключают компонент Rigidbody2D, без которого они не смогут работать.
Здесь, на изображении, специально не показано название компонента джоинта, так как эти настройки являются общими для них всех. Исключением является Target joint, который мы разберем в самом конце статьи.
Начнем с поля Connected Rigid Body. В это поле можно поместить любой физический объект с которым необходимо установить связь.
Далее поле Enable Collision, которое включает и отключает коллизии между джоинтом и присоединенным объектом.
Поле Anchor, представляет собой Vector2, в котором можно указать место расположения крепления джоинта относительно его Transform’а. Обычно место расположения джоинта указывают сразу при создании на сцене и поле Anchor оставляют без изменений.
Следующее поле Connected Anchor, также представляет собой Vector2, где уже в свою очередь необходимо указать конкретно точку крепления объекта к джоинту относительно самого Transform’а джоинта.
По умолчанию поле Auto Configure Connected Anchor включено и поэтому точка крепления объекта к джоинту указывается автоматически как “центр” самого объекта. К примеру, когда нужно “зацепить” объект за какой либо край, галочку напротив поля Auto Configure Connected Anchor необходимо снять и вручную установить “место зацепления”.
Поле Break Force указывает силу, при превышении которой произойдет разрыв соединения между джоинтом и объектом. По умолчанию стоит значение Infinity, при котором разрыва соединения не произойдет.
У большинства джоинтов также имеется поле Break Torque, где можно указать силу, при которой произойдет разрыв соединения при вращении. Также как и поле Break Force – по умолчанию имеет значение Infinity.
И так ,с основными настройками джоинтов мы разобрались. Попробуем теперь более подробно разобрать некоторые джоинты, с примерами их работы.
Fixed joint
“Фиксированный” джоинт – самый элементарный джоинт из всего списка, полностью фиксирует физический объект в определенном месте. В общем, можно описать работу этого джоинта, как если бы вы прибили объект гвоздем к стене – ни пошевелится, ни повернуться такой объект не может.
У этого джоинта помимо стандартных настроек Break Force и Break Torque есть новые поля Damping Ratio и Frequence, изменяя которые можно определить, как сильно объект фиксируется в точке. Оба поля принимают числовое значение, где 0 означает полную фиксацию объекта, вне зависимости от внешних воздействий на объект.
Hinge joint
Следующий Hinge joint, также фиксирует объект в точке, и в отличие от Fixed joint не прерывает “воздействия” физики на сам объект.
Этот джоинт позволяет применять силу для совершения вращения объекта, а также вводить ограничения на угол вращения. Для этого в компоненте есть поле Motor, где указаны две переменные – Motor Speed и Maximum Motor Force, для скорости вращения и максимальной силы, применяемой для совершения вращения. Ограничивать угол вращения можно в поле Angle Limits, где для этого введены две переменные – Lower и Upper Angle – нижнего и верхнего предела угла вращения.
Slider joint
Этот джоинт немного похож на предыдущий Hinge joint, он тоже позволяет применять силу к объекту. Разница в том, что Hinge joint это делает для вращения объекта, а Slider joint применяет эту силу, чтобы двигать объект под определенным углом.
Также этот джоинт имеет новое поле Angle, где можно указать под каким углом объект будет перемещаться.
Distance joint
Следующий джоинт, как и остальные, имеет стандартный набор настроек, а также новое поле Distance, где можно указать минимальное расстояние между джоинтом и объектом. Если собрать “цепь” из нескольких таких джоинтов, то можно получить отличный аналог веревки, которая не растягивается и не рвется.
Spring joint
Этот джоинт также имеет поле Distance, но в отличие от Distance joint – позволяет имитировать “пружину” при растягивании. Как и Fixed joint – имеет поля Damping Ratio и Frequency, где можно указать – как быстро и сильно необходимо фиксировать объект к джоинту.
Target joint
Особый джоинт из всего списка, которому нельзя указать объект для присоединения – у него просто нет такого поля. Дело в том что если раньше мы сначала определяли позицию джоинта на сцене и к нему уже крепили объект, то в случае с Target joint – сам объект и является джоинтом, и вместо крепления к другому джоинту, он крепится к определенной точке на сцене. Для этого у него есть новое поле – Target, представленное в виде Vector2, где можно указать локальную точку крепления относительно объекта.
По принципу работу он немного похож на Spring joint, в котором также есть поля Damping Ratio и Frequency.
Заключение
Все эти джоинты используется чаще всего, они подходят для создания самых разнообразных физических систем. Важно помнить, что джоинты – это физические объекты, поэтому обрабатывать их перемещения, вращение и другие действия необходимо в методе обработки FixedUpdate, с работой которого можно ознакомится, скачав исходник проекта, со всеми примерами джоинтов отсюда.
В заголовке Hinge joint – как реализовано перетаскивание объектов по клику в нужную точку?
Проконсультируйтесь с нами через почту сайта: support@unity3dschool.com