前回に引き続き、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