Приветствую всех друзья! В прошлой статье мы подробно рассмотрели предназначение слоев в Unity. Сегодня мы поговорим о группе компонентов Constraints, они же ограничения.
Группа компонентов Constraint связывает позицию, вращение или размер одного игрового объекта с другим. С ограничениями игровой объект движется, вращается и масштабируется также, как и тот с которым он связан.
Unity поддерживает следующие типы компонентов ограничений:
1. Aim constraint: Поворачивает ограниченный игровой объект лицом к связанному с ним игровому объекту
2. Look At constraint: Поворачивает ограниченный игровой объект к связанному с ним игровому объекту (это упрощенный Aim constraint)
3. Parent constraint: Перемещает и вращает ограниченный игровой объект с помощью связанного с ним игрового объекта
4. Position constraint: Перемещение ограниченного игрового объекта с помощью связанного с ним игрового объекта
5. Rotation constraint: Вращение ограниченного игрового объекта с помощью связанного с ним игрового объекта
6. Scale constraint: Масштабирование ограниченного игрового объекта с помощью связанного с ним игрового объекта
Привязка к игровому объекту.
Используйте лист Source в компоненте Constraint чтобы указать объекты на которые будет ссылаться ограниченный игровой объект.
К примеру, чтобы сделать курсор, следующий за космическим кораблем в 2D шутере – добавьте компонент Position Constraint к курсору. Чтобы связать курсор с кораблем нужно в компоненте Position Constraint найти лист Source нажать в нем кнопку + и в появившееся поле перенести из окна иерархии игровой объект корабль. После проделанных действий – когда игрок будет двигать космический корабль, курсор будет следовать за ним.
Ограничение может быть связано не только с одним, но и с несколькими игровыми объектами. Для этого в листе Source мы можем добавить с помощью кнопки + произвольное количество полей. В этом случае используется усредненное положение, вращение и масштабирование исходных игровых объектов. Например, чтобы направить свет на группу объектов – повесьте на него компонент Aim Constraint и добавьте в него игровые объекты за которыми свет должен «следить». После этих действий свет будет брать усредненное значение положения игровых объектов и обращаться в их сторону.
Unity оценивает исходные игровые объекты добавленные в лист Source в том порядке, в котором они туда были добавлены. Порядок не влияет на ограничения по положению и масштабу. Однако он оказывает влияние на такие компоненты ограничения как Parent, Rotation и Aim. Чтобы получить желаемый результат, измените порядок в листе, перетаскивая элементы.
Также вы можете делать цепочку ограничений для игровых объектов. Например, сделать утку с утятами, которые идут в одну цепочку. Для этого достаточно добавить компонент Position Constraint к первому утенку, и связать его с мамой уткой. Далее по той же схеме второму утенку добавляем тот же компонент и связываем его с первым утёнком. Таким образом при движении мамы утки – утята будут двигаться за ней.
Главное избегайте создания циклов ограничений – они могут привести к непредсказуемым результатам во время выполнения игры.
Установка свойств ограничений.
Используйте окно инспектора чтобы менять свойства компонентам ограничений.
Пройдемся по основным параметрам компонента (эти параметры есть у всей группы компонентов):
1. Weight – этот параметр определяет с какой силой привязанный игровой объект влияет на ограниченный. Если он равен 1 – то ограниченный объект под полным влиянием, если 0 – то все ограничения с него сняты и привязанный объект никак не влияет на него. Не стоит при этом забывать, что ограниченному объекту все также нельзя изменить вручную параметры ограничения (то есть если мы ограничили его по перемещению, то в окне сцены вы не сможете вручную переместить его даже если вес влияния находится на 0, но это можно сделать если отключить галочку напротив пункта Lock).
2. Constraint Settings – это список содержит в себе четыре свойства о которых ниже распишу подробнее.
3. Lock – Если этот параметр включен – то ограничение работает и связанный объект воздействует на ограниченный, в ином случае этого не происходит и мы можем поменять Position/Rotation/Scale At Rest и Position/Rotation/Scale Offset в окне сцены. Также при отключенном параметре мы можем как угодно менять свойства компонента Transform у ограниченного объекта.
4. Position/Rotation/Scale At Rest – в зависимости от компонента ограничения этот параметр может влиять как на позицию, так и на вращение с масштабированием, но смысл один. Он позволяет установить позицию/поворот/масштаб в состоянии покоя, то есть когда вес равен 0.
5. Position/Rotation/Scale Offset – также зависит от компонента ограничения что именно этот параметр будет менять, но по сути он позволяет изменить отступ/смещение ограниченного объекта от связанного с ним.
6. Freeze Position/Rotation/Scale Axes – позволяет выбрать по каким осям ограниченный объект будет следовать трансформациям связанного с ним объекта.
Активация и блокировка ограничений.
Работа с ограничениями включает в себя два аспекта – это активация и блокировка.
Вы активируете ограничение чтобы позволить ему оценить положение, поворот или масштаб ограниченного игрового объекта. Unity не оценивает неактивные ограничения.
Вы блокируете ограничение чтобы позволить ему перемещать, вращать или масштабировать игровой объект. Заблокированное ограничение берет под свой контроль соответствующие части преобразований игрового объекта. Вы не можете вручную менять соответствующие свойства игрового объекта как на сцене, так и в свойствах самого компонента Transform. Чтобы поменять свойства Transform ограниченного игрового объекта – разблокируйте его переключателем Lock (находится в разворачиваемом списке Constraint Settings).
При добавлении компонента из группы ограничений – они по умолчанию являются не активированными и разблокированными, для того чтобы у пользователя была возможность настроить все параметры.
Для удобства у каждого компонента ограничения есть две кнопки – Activate и Zero:
1. Activate – сохраняет текущее смещение от исходного игрового объекта, после чего активирует и блокирует ограниченный игровой объект.
2. Zero – сбрасывает свойства компонента Transform в соответствии с привязанным игровым объектом, затем активирует и блокирует ограниченный игровой объект.
Анимирование и комбинирование ограничений.
Анимировать ограничения можно с помощью окна Animation в Unity (я о нем еще напишу в своих будущих статьях). Тут же можно вкратце сказать, что данное окно позволяет анимировать игровые объекты и параметры их компонентов прямо в Unity. Иногда этот функционал очень удобен. Если вернуться к теме ограничений, то мы можем сделать с помощью анимации параметра веса (Weight), например, меч который игрок достает из ножен из-за спины. Для этого достаточно настроить положение меча при весе 0, закреплённым на спине, а при весе 1, в руке, и просто анимировать плавное изменение данного веса от 0 к 1. В принципе тоже самое можно сделать с помощью кода, но это темы будущих статей.
Также стоит упомянуть что мы можем на один игровой объект накладывать несколько компонентов ограничений, но только разных, два одинаковых не получится, да и незачем. Unity оценивает компоненты в порядке в котором они добавлены в окне инспектора.
Импорт ограничений.
Некоторые программы для моделирования 3D графики позволяют устанавливать ограничения (например, Maya), так вот Unity при импорте таких моделей позволяет перенести эти ограничения.
Для каждого ограничения Unity автоматически создает правильный компонент ограничения и связывает его с правильным игровым объектом, настроенным в редакторе моделирования ранее.
Добавление и настройка ограничений.
Добавление для компонентов ограничений такое же, как и для любого другого компонента – выберите необходимый игровой объект и в окне инспектора нажмите на кнопку Add Component, после чего проще всего в верхней части открывшегося окошка в строке поиска написать название компонента (рекомендую писать Const – этого достаточно для отображения всей группы компонентов) и выбрать тот что нужен. Далее добавьте компоненту в листе Source игровой объект, с которым будет связан этот ограниченный игровой объект. Не забудьте выставить все необходимые настройки для компонента Transform, после чего можно нажимать на кнопку Activate. Все ваш компонент стал ограниченным и теперь будет повторять изменения компонента Transform за связанным игровым объектом. Если у вас есть желание отредактировать ограничения, просто уберите галочку с пункта Lock – отредактируйте трансформации ограниченного объекта и вновь включите данный пункт.
На сегодня это все. В следующей статье мы познакомимся с тем как в Unity устроены вращения и ориентация в пространстве. Спасибо всем, кто дочитал эту статью до конца, подписывайтесь на канал, ставьте лайки, а для тех, у кого появились вопросы - спрашивайте в комментариях! А если вы хотите помочь данному каналу в развитии – делитесь этой статьей с друзьями в социальных сетях!