【Unity】子のAnimatorを親から操作してみるテスト


概要

例えば、こんなアニメーションをつけたい時に、

子要素が三つあって、動きは同じなんだけど、開始のタイミングだけずらしたい。
動きは同じなんだけど、Animationのキーは、三倍打たなきゃいけない・・・面倒だなぁ。

Animationで、タイミングだけ指定できないかな?やってみよう!

SerializeFieldはAnimationでキーが打てる

そもそもMonoBehaviourスクリプトのSerializeFieldは、Animationで操作できます。ColorをSerializeFieldに出して、Animationで色を変える・・・なんてのは、よくやるテクニックです。

今回は、子要素のAnimatorのパラメーターを、SerializeFieldに用意して、親のアニメーションのキーから操作するようにします。

Animatorの構造

子供のAnimatroはこんな感じ。
シンプルな構造で、Any StateからBoolパラメーターで、即遷移するようにしました。
※TriggerではなくBoolの方が、アニメーションから制御しやすい

子要素は3つありますが、全部同じAnimatorを使っています。
アニメーションの更新があった場合でも、一つのAnimatorを更新すれば良いのでラクチンです。

親のAnimatorはこんな感じです。

用途にあわせて自由に作りましょう。
今回は、in Triggerで入って、out Triggerではけるような動きを作っています。

スクリプト

childにアタッチするスクリプトはこんな感じです。
子要素のAnimatorのパラメーターと同じSerializeFieldを用意し、UpdateでSetBoolするだけです。

SerializeAnim.cs
using UnityEngine;

public class SerializeAnim : MonoBehaviour
{
    Animator mAnimator;
    [SerializeField] public bool BoolWait;
    [SerializeField] public bool BoolStay;
    [SerializeField] public bool BoolIn;
    [SerializeField] public bool BoolOut;
    [SerializeField] public bool BoolRotate;

    void Awake()
    {
        mAnimator = GetComponent<Animator>();
    }

    void Update()
    {
        mAnimator.SetBool("wait", BoolWait);
        mAnimator.SetBool("stay", BoolStay);
        mAnimator.SetBool("in", BoolIn);
        mAnimator.SetBool("out", BoolOut);
        mAnimator.SetBool("rotate", BoolRotate);
    }
}

root_in.animにキーを打つ

root_in.animに、キーを打ってみます。
Add Propertyを選択すると、子要素のSerializeFieldが追加できます。

1秒ごとにズラして、child1のBool in、child2のBool in、child3のBool inのキーを打ちます。

他のAnimationも同じように準備します。

さて、実行だ!


おおー、うまく動いてますねー。

メリット/デメリット

  • 長所
    • 子供の動きを作るのが一つだけでいい
    • 更新があった場合、一つだけ更新すれば良いので、修正が少なくて済む
  • 短所
    • Animationウインドウのプレビューで動きを見ることができない

サンプル