コメントの通り、ソース1行ではなんとも言えませんので、推測ですが、
0. 1体目のGetComponent<Animator>().Play();
によって、1体目のアニメーションが再生される。
0. 1体目のアニメーションが終わりまで再生される。
0. 2体目のGetComponent<Animator>().Play();
によって、2体目のアニメーションが再生される。
0. 2体目のアニメーションが終わりまで再生される。
0. (以下省略)
と考えたのかもしれません。
しかし、GetComponent<Animator>().Play();
はアニメーションの終わりまで待つという処理はありません。
よって、アニメーションの終わりになっているかどうかを検知してから、次のGetComponent<Animator>().Play();
を実行する、といったことをする必要があります。
アニメーションの終わりになっているかどうかについては、以下のページが参考になると思います。
http://tsubakit1.hateblo.jp/entry/2016/02/11/021743
追記:
void Update()
内に書かれた処理は、アタッチされた全てのオブジェクトごとに、毎フレーム実行されます。
よって、アタッチされた全てのオブジェクトで同時に再生されてしまうのは当たり前です。
正直、Update()
内に直接書いている時点で、プログラミングをあまり理解していないとしか思えないです。
まずは基本的なことから、プログラミングを理解しましょう。
Animator.Play()
を使って、アニメーションをオブジェクト別に制御することは出来ます。
制御の方法については、すごくざっくり言うと、「○○だったとき、Playする」といった感じです。
実装に必要な知識を挙げてみると、以下の通りです(過不足はあると思いますが)。
・if文(ものすごく当たり前ですが)
・「○○だったとき」の○○を取得する方法
・他のオブジェクトにあるComponentを取得・操作する方法
追記2:
解決済みとのことですが、少々問題になりそうな点があったので、追記します。
Update()内に直接書いている時点で~
と言いましたが、これは関数化するべきというわけではありません。
(明らかに誤解を招く表現で申し訳ないです…)
これは、「Animator.Play()
は1回呼べば十分なのに、なぜUpdate()
で毎回呼んでいるんだ…」ということです。
もし、仮にUpdate()
に書くのであれば、このようにif文と組み合わせて書くべきでしょう
C#
1 void Update() {
2 if (再生したい条件) {
3 gameObject.GetComponent<Animator>().Play("ステート名");
4 }
5 }
また、待機用と再生用の別々のAnimationControllerを用意するよりも、1つのAnimationControllerに待機用のStateと再生用のStateを用意するほうがよいです。
以下、サンプルソースとAnimationControllerの設定です。
C#
1using System.Collections;
2using System.Collections.Generic;
3using UnityEngine;
4
5public class AnimationPlayer : MonoBehaviour
6{
7 bool alreadyPlaying = false; // 再生済みならtrue
8
9 void Update()
10 {
11 Animator animator = gameObject.GetComponent<Animator>();
12 AnimatorStateInfo animInfo = animator.GetCurrentAnimatorStateInfo(0);
13 if (!alreadyPlaying)
14 {
15 if (!animator.GetBool("playFlag"))
16 {
17 animator.SetBool("playFlag", true); // 再生
18 }
19 else if (!(animInfo.normalizedTime < 1.0f))
20 {
21 animator.SetBool("playFlag", false); //再生が終了し、待機状態に戻す
22 alreadyPlaying = true;
23 }
24 }
25 }
26}
AnimationController
wait→play間の矢印
play→wait間の矢印