【Unity】【Animator】IKを使ってモーションの一部をオブジェクトに追従させる

UnityでAnimatorのIK機能を使う方法です。

Unity2018.3.1

何ができる?

IK(Inverse Kinematics)を使うとモーション中にあるオブジェクトに注視させたり、
手や足だけをあるオブジェクトに自然にくっつけることができます。

設定次第で歩いているモーション中にキャラに物を持たせたりできます。

f:id:halya_11:20190213205408g:plain

使い方

IKを使うにはまずAnimator ControllerのLayerの歯車ボタンからIK Passにチェックを入れます。

f:id:halya_11:20190213204615p:plain

次にこんな感じのスクリプトを書きます。

using UnityEngine;

public class AnimatorExample : MonoBehaviour
{
    public Animator Animator { get { return GetComponent<Animator>(); } }

    [SerializeField]
    private Transform _lookTarget;
    [SerializeField]
    private Transform _leftHandIkTarget;
    [SerializeField, Range(0, 1)]
    private float _ikWeight;

    private void OnAnimatorIK(int layerIndex)
    {
        if (_lookTarget != null) {
            Animator.SetLookAtWeight(_ikWeight);
            Animator.SetLookAtPosition(_lookTarget.position);
        }

        if (_leftHandIkTarget != null) {
            Animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, _ikWeight);
            Animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, _ikWeight);
            Animator.SetIKPosition(AvatarIKGoal.LeftHand, _leftHandIkTarget.position);
            Animator.SetIKRotation(AvatarIKGoal.LeftHand, _leftHandIkTarget.rotation);
        }
    }
}

_ikWeightが1に近づくほどIKで計算された姿勢が反映されます。
上記のスクリプトでは注視点と左手の位置がIKで変えられるようにしています。

結果

注視点を動かすとこのような結果になります。

f:id:halya_11:20190213210012g:plain

左手を動かすとこのような結果になります。

f:id:halya_11:20190213210052g:plain

Humanoidのみの機能

IKはHumanoidのみの機能となります。
Genericなモデルには適用できないのでご注意ください。

参考

docs.unity3d.com