В большинстве случаев анимация создается путем поворота углов суставов скелета до заданных значений. Положение дочернего соединенияФизический компонент, обеспечивающий динамическое соединение между компонентами Rigidbody, обычно допускающий некоторую степень движения, например шарнир. . Подробнее
См. Словарь меняется в зависимости от поворота родителя и, следовательно, конечной точки цепочки суставов можно определить по углам и взаимному расположению отдельных суставов, которые она содержит. Этот метод позирования скелета известен как прямая кинематикагеометрия, описывающая положение и ориентацию суставов персонажа и тела. Используется инверсной кинематикой для управления движением персонажа.
См. в Словарь.
Однако часто бывает полезно взглянуть на задачу по расположению суставов с противоположной точки зрения — при выбранном положении в пространстве двигайтесь назад и найдите допустимый способ ориентации суставов так, чтобы конечная точка приземлялась на эту точку. позиция. Это может быть полезно, когда вы хотите, чтобы персонаж коснулся объекта в точке, выбранной пользователем, или убедительно поставил ноги на неровную поверхность. Этот подход известен как обратная кинематика (IK) и поддерживается в Mecanim для любого гуманоидного персонажа с правильно настроенным аватаром.
Чтобы настроить IK для персонажа, у вас обычно есть объекты вокруг сценыСцена содержит окружение и меню вашего персонажа. игра. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
Посмотрите в Словарь, с которым взаимодействует персонаж, а затем настройте ИК через скрипт, в частности, функции Animator, такие как
SetIKPositionWeight,
SetIKRotationWeight,
SetIKPosition,
SetIKRotation,
SetLookAtPosition,
bodyPosition,
bodyRotation
На иллюстрации выше мы показываем, как персонаж хватает цилиндрический предмет. Как это сделать?
Мы начинаем с персонажа, у которого есть действительный аватаринтерфейс для перенацеливания анимации с одного рига на другой. Подробнее
См. в Словарь.
Затем создайте Контроллер анимацииУправляет анимацией через слои анимации с помощью машин состояний анимации и деревьев смешивания анимации, управляемых параметрами анимации. На один и тот же контроллер Animator могут ссылаться несколько моделей с компонентами Animator. Подробнее
См. в Словарь, содержащий хотя бы одну анимацию для символ. Затем на панели «Слои» окна Animatorокна, в котором визуализируется и редактируется контроллер Animator. Подробнее
См. в Словарь, щелкните значок шестеренки настроек слоя и проверьте Флажок 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);
}
}
}
}
Поскольку мы не собираемся, чтобы рука персонажа доставала внутри объекта до его центра (точки вращения цилиндра), мы помещаем пустой дочерний объект (в данном случае с именем «Ручка для захвата цилиндра») там, где должна быть рука. на цилиндре и поверните его соответствующим образом. Затем рука нацеливается на этот дочерний объект.
Этот игровой объект «ручка захвата» затем должен быть назначен как свойство «Объект правой руки» скрипта IKControl
В этом примере целью взгляда является сам цилиндр, поэтому персонаж смотрит прямо в центр объекта, даже если ручка находится внизу.
Войдите в режим воспроизведения, и вы увидите, как IK оживает. Наблюдайте за тем, как персонаж захватывает и освобождает объект, когда вы устанавливаете флажок IKActive, и попробуйте переместить цилиндр в игровом режиме, чтобы увидеть, как рука и кисть следуют за объектом.