テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】Timelineのアニメーションに微調整を加える(Humanoid編)

前回に引き続き、Timelineのアニメーションに微調整を加える方法です。

今回はHumanoid向け

HumanoidはTimelineでアニメーションを上書きしにくい

Humanoid Rigで動く部位の場合、Genericと同じ方法でアニメーションの微調整が出来ません。というのも、Timelineから生成するアニメーションは基本的にGenericになるので、Humanoidとは互換性がない為です。

(つまり髪や手首といった

なので、Humanoidのアニメーションを微調整したい場合、IK を使用するか、Constraint で少し動作に追加エフェクトをかける必要があります。

f:id:tsubaki_t1:20190523223841j:plain

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);
    }
}

f:id:tsubaki_t1:20190523224340j:plain

あとはIKを動かせるようにする訳ですが、ここでのポイントがAnimatorControllerでIKを有効化する事です。Timelineで動かす場合もIKの設定は有効になるみたいです。

もし対象がカットシーン専用データ(AnimatorControllerを持っていない)場合は、空のAnimatorController(AnimationClipが一切登録されていない)でもOKみたいです。

f:id:tsubaki_t1:20190523224554j:plain

これでTimeline中でも視点や手の位置といった部位は調整出来ました。

個人的にはTimelineの仕組みを考えるとバグな気もしますが、動きます。

Constraintを使用する場合

IKが使用できないケース…例えば腕の向きを僅かに変更したい…つまりFK的なアプローチが必要な場合は、こちらで行います。

これは正直なところ、コードのLateUpdateで更新する方が理にかなっているような気もしますが、面倒くさいのでConstraintで云々してしまいます。例えば足を少し調整したい場合

  • Rotation Constraint を足のボーンに追加
  • Rotation Constraintに足のボーンとエフェクターを設定
  • 有効な方のウェイトを1にして、他を0にする

という感じで行けます。

f:id:tsubaki_t1:20190523230029j:plain

関連

今回のIKのアプローチを使用してボーンを動かすプロダクトです。

github.com