前回に引き続き、Timelineのアニメーションに微調整を加える方法です。
今回はHumanoid向け
HumanoidはTimelineでアニメーションを上書きしにくい
Humanoid Rigで動く部位の場合、Genericと同じ方法でアニメーションの微調整が出来ません。というのも、Timelineから生成するアニメーションは基本的にGenericになるので、Humanoidとは互換性がない為です。
(つまり髪や手首といった
なので、Humanoidのアニメーションを微調整したい場合、IK を使用するか、Constraint で少し動作に追加エフェクトをかける必要があります。

IKを使用する場合
IKを使用する場合、AnimatorのIKを使用して手や足の位置を調整します。
IKの設定は普通に行います。例えば下のようなコンポーネントをIKを使用するAnimatorに設定します。
using UnityEngine;
[RequireComponent(typeof(Animator))]
public class CharacterIK : MonoBehaviour
{
[SerializeField] AvatarIKGoal goal; // どの部位のIKを使用するか
[SerializeField] AvatarIKHint hint; // goalと同じ部位のヒントを選択
[SerializeField] Transform goalTransform;// 最終的な位置
[SerializeField] Transform hintTransform;// 肘や膝の位置のヒント
[SerializeField][Range(0, 1)] float weight, hintWeight;
private Animator animator;
void Start()
{
animator = GetComponent<Animator>();
}
private void OnAnimatorIK(int layerIndex)
{
animator.SetIKPosition(goal, goalTransform.position);
animator.SetIKHintPosition(hint, hintTransform.position);
animator.SetIKHintPositionWeight(hint, hintWeight);
animator.SetIKPositionWeight(goal, weight);
}
}

あとはIKを動かせるようにする訳ですが、ここでのポイントがAnimatorControllerでIKを有効化する事です。Timelineで動かす場合もIKの設定は有効になるみたいです。
もし対象がカットシーン専用データ(AnimatorControllerを持っていない)場合は、空のAnimatorController(AnimationClipが一切登録されていない)でもOKみたいです。

これでTimeline中でも視点や手の位置といった部位は調整出来ました。
個人的にはTimelineの仕組みを考えるとバグな気もしますが、動きます。
Constraintを使用する場合
IKが使用できないケース…例えば腕の向きを僅かに変更したい…つまりFK的なアプローチが必要な場合は、こちらで行います。
これは正直なところ、コードのLateUpdateで更新する方が理にかなっているような気もしますが、面倒くさいのでConstraintで云々してしまいます。例えば足を少し調整したい場合
- Rotation Constraint を足のボーンに追加
- Rotation Constraintに足のボーンとエフェクターを設定
- 有効な方のウェイトを1にして、他を0にする
という感じで行けます。

関連
今回のIKのアプローチを使用してボーンを動かすプロダクトです。
I made a humanoid finger controller for Unity. Might be useful for some people.
— h.omae (@pigeon6) 2019年2月10日
指用のコントローラーを作ってみました。指だけ後付けで対応必要な時に便利かも。https://t.co/lQEabTXLL6 #unity #UnityTips pic.twitter.com/YQcaLkaqiw