概要
子要素が三つあって、動きは同じなんだけど、開始のタイミングだけずらしたい。
動きは同じなんだけど、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するだけです。
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ウインドウのプレビューで動きを見ることができない