前書き
Unityでアニメーションを制御していると、本来一度だけ再生されるはずのアニメーションが繰り返されてしまうという現象に何度か遭遇すると思います。本来であれば一度だけ動いてほしいのに何度も同じ挙動をすると見た目的にちょっと違和感が出てきてしまうことと思います。
この記事では、その原因と対処法について、次の内容を中心に解説します。
- なぜアニメーションが繰り返されるのか?
- Has Exit Time の役割とは?
- Any State とは何か?
Unityでのアニメーション制御に悩んでいる方の参考になれば幸いです。
どういう事象?
UnityのAnimatorで、あるアニメーション(例:Attack)が何度も再生されてしまうという問題に遭遇しました。本来は1度攻撃したら移動モーションに移るはずが2回攻撃モーションを実行しています。
トリガーを使って一度だけアニメーションを再生したはずなのに、実行中に同じアニメーションに繰り返し遷移してしまう……。これは、遷移条件や状態遷移の設計が適切でないことが原因です。
何が原因?

Animatorでよく使われるのが「Any State」からの遷移です。
Any Stateとは、どのステート(状態)からでも遷移できる特別なステートです。 例えば、Idle中でもRun中でも、プレイヤーが攻撃ボタンを押したら「Attack」アニメーションに遷移できるようになります。
しかしこの便利な機能、条件次第では無限に同じステートに遷移し続けてしまうという落とし穴があります。
特に、以下のような条件を満たしていると危険です:
- Any State → Attack の遷移に Triggerを使用している
- 遷移にHas Exit Timeが無効になっている(チェックが外れている)
- Attack が再生中に再度 Triggerが立ってしまう
この状態では、Attack 再生中に再度 Attack に遷移するという現象が起こり、アニメーションが何度も繰り返されてしまいます。
対策方法(Has Exit Time にチェックを入れる)
今回、自分が作成したAnimatorの設定を見てみると Has Exit Time にチェックが入っていませんでした。

Attackアニメーションが2回されてしまう問題の解決には、「Has Exit Time」にチェックを入れることが有効そうです。
そもそもHas Exit Time とは?
「Has Exit Time」とは、
現在のアニメーションの終了タイミングまで待ってから、次のステートに遷移する
という制御を入れる設定項目です。
これを有効にすると、Triggerが再び立ってもアニメーションが終わるまでは次の遷移が発生しなくなります。
つまり、Attackが一度再生された後にのみ、再度遷移が許可されるようになるため、 ループして再生されることがなくなります。
Has Exit Time にチェックを入れてみた

と、いうことでAnyState -> Attack のステータスの Has Exit Time にチェックを入れた状態で動かしてみました。
無事、Attackアニメーションが1回だけ実行された後に移動モーションが実行されていることが分かりますね。
まとめ
UnityのAnimatorで一度だけ再生したいアニメーションが繰り返し再生される場合、
- Any Stateからの遷移に注意
- Has Exit Timeのチェックを入れて、終了まで待たせる
という2点を押さえるだけで、かなり安定した挙動になります。
Animatorは便利ですが、条件が重なると意図しないループが起こりがちです。
この記事が、同じようなアニメーション制御の悩みを抱える方のお役に立てば幸いです!
コメント