Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

В большинстве случаев анимация создается путем поворота углов суставов скелета до заданных значений. Положение дочернего соединенияФизический компонент, обеспечивающий динамическое соединение между компонентами Rigidbody, обычно допускающий некоторую степень движения, например шарнир. . Подробнее
См. Словарь
меняется в зависимости от поворота родителя и, следовательно, конечной точки цепочки суставов можно определить по углам и взаимному расположению отдельных суставов, которые она содержит. Этот метод позирования скелета известен как прямая кинематикагеометрия, описывающая положение и ориентацию суставов персонажа и тела. Используется инверсной кинематикой для управления движением персонажа.
См. в Словарь
.

Однако часто бывает полезно взглянуть на задачу по расположению суставов с противоположной точки зрения — при выбранном положении в пространстве двигайтесь назад и найдите допустимый способ ориентации суставов так, чтобы конечная точка приземлялась на эту точку. позиция. Это может быть полезно, когда вы хотите, чтобы персонаж коснулся объекта в точке, выбранной пользователем, или убедительно поставил ноги на неровную поверхность. Этот подход известен как обратная кинематика (IK) и поддерживается в Mecanim для любого гуманоидного персонажа с правильно настроенным аватаром.

Чтобы настроить IK для персонажа, у вас обычно есть объекты вокруг сценыСцена содержит окружение и меню вашего персонажа. игра. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
Посмотрите в Словарь
, с которым взаимодействует персонаж, а затем настройте ИК через скрипт, в частности, функции Animator, такие как SetIKPositionWeight, SetIKRotationWeight, SetIKPosition, SetIKRotation, SetLookAtPosition, bodyPosition, bodyRotation

На иллюстрации выше мы показываем, как персонаж хватает цилиндрический предмет. Как это сделать?

Мы начинаем с персонажа, у которого есть действительный аватаринтерфейс для перенацеливания анимации с одного рига на другой. Подробнее
См. в Словарь
.

Затем создайте Контроллер анимацииУправляет анимацией через слои анимации с помощью машин состояний анимации и деревьев смешивания анимации, управляемых параметрами анимации. На один и тот же контроллер Animator могут ссылаться несколько моделей с компонентами Animator. Подробнее
См. в Словарь
, содержащий хотя бы одну анимацию для символ. Затем на панели «Слои» окна Animatorокна, в котором визуализируется и редактируется контроллер Animator. Подробнее
См. в Словарь
, щелкните значок шестеренки настроек слоя и проверьте Флажок IK Pass во всплывающем меню.

Установка флажка IK Pass для слоя по умолчанию
Установка флажка IK Pass для слоя по умолчанию

Убедитесь, что контроллер анимации назначен компоненту анимациикомпоненту модели, который анимирует эту модель с помощью функции анимации. система. Компонент имеет ссылку на ресурс Animator Controller, который управляет анимацией. Подробнее
См. в Словарь
:

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

using UnityEngine; using System; using System.Collections; [RequireComponent(typeof(Animator))] public class IKControl : MonoBehaviour { protected Animator animator; public bool ikActive = false; public Transform rightHandObj = null; public Transform lookObj = null; void Start () { animator = GetComponent(); } //a callback for calculating IK void OnAnimatorIK() { if(animator) { //if the IK is active, set the position and rotation directly to the goal. if(ikActive) { // Set the look target position, if one has been assigned if(lookObj != null) { animator.SetLookAtWeight(1); animator.SetLookAtPosition(lookObj.position); } // Set the right hand target position and rotation, if one has been assigned if(rightHandObj != null) { animator.SetIKPositionWeight(AvatarIKGoal.RightHand,1); animator.SetIKRotationWeight(AvatarIKGoal.RightHand,1); animator.SetIKPosition(AvatarIKGoal.RightHand,rightHandObj.position); animator.SetIKRotation(AvatarIKGoal.RightHand,rightHandObj.rotation); } } //if the IK is not active, set the position and rotation of the hand and head back to the original position else { animator.SetIKPositionWeight(AvatarIKGoal.RightHand,0); animator.SetIKRotationWeight(AvatarIKGoal.RightHand,0); animator.SetLookAtWeight(0); } } } }

Поскольку мы не собираемся, чтобы рука персонажа доставала внутри объекта до его центра (точки вращения цилиндра), мы помещаем пустой дочерний объект (в данном случае с именем «Ручка для захвата цилиндра») там, где должна быть рука. на цилиндре и поверните его соответствующим образом. Затем рука нацеливается на этот дочерний объект.

Пустой игровой объект действует как цель IK, поэтому рука будет правильно располагаться на видимом объекте Cylinder.
Пустой игровой объект действует как цель IK, поэтому рука будет правильно располагаться на видимом объекте Cylinder.

Этот игровой объект «ручка захвата» затем должен быть назначен как свойство «Объект правой руки» скрипта IKControl

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

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

Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3