[Unity] Humanoid animation をデフォルメキャラに適用する


Mechanimに対応したモデルはアニメーションをいろいろ流用できて便利ですが、通常の8等身モデル用アニメーションをデフォルメキャラに適用するとどうしても腕が頭や体に埋まりがちです。
そこで、腕のアニメーションを補正して、頭と体に埋まりにくいようにしてみます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace Demo
{
    [System.Serializable]
    public class RotationTuner
    {
        public Transform transform = null;
        public Quaternion defaultRotation = Quaternion.identity;
        [Range(0f, 1f)] public float rate = 0.5f;
    }

    public class AnimationTuner : MonoBehaviour
    {
        [SerializeField] RotationTuner[] m_tunerArr = null;
        [SerializeField,Range(0f,1f)] float m_intensity = 1f;

        // Start is called before the first frame update
        void Start()
        {
            for (int i = 0; i < m_tunerArr.Length; ++i)
            {
                m_tunerArr[i].defaultRotation = m_tunerArr[i].transform.localRotation;
            }
        }

        // Update is called once per frame
        void Update()
        {
        }

        void LateUpdate()
        {
            for (int i = 0; i < m_tunerArr.Length; ++i)
            {
                m_tunerArr[i].transform.localRotation = Quaternion.Lerp(m_tunerArr[i].defaultRotation, m_tunerArr[i].transform.localRotation, m_tunerArr[i].rate + (1f- m_tunerArr[i].rate)*(1f-m_intensity));
            }
        }
    }
}

上記のスクリプトをアニメーションのついたモデルにアタッチし、腕(およびアニメーションを補正したい)のTransformおよび補正度合いをセットします。

補正度合いはDefaultRotationと現在のアニメーションのRotationの合成割合です。1に近いほど元のアニメーションに近くなります。
DefaultRotationにはTポーズ等ベースとなるポーズのRotationを入れますが、
入力せず(全て0)にしておけばStart時のポーズを自動的に入力してくれます。

また、Intensityの値をアニメーションに合わせて変更することで、モーションに合わせてさらに細かく制御することも可能です。

動画
関連:アニメーションIKで、(やだ、あの人こっち見てる・・・)にする

この「特定の関節を後から補正する方法」は個人的に比較的よく使用していて、他にも
・Mechanim以外のアニメーションで自然に特定の方向を向かせる
・多関節やしっぽなどを特定の場所に自然に動かす
等にも応用可能です。