1162 文字
6 分
【備忘録】無条件遷移を作ってる時に気付いたExitTimeの罠

※ 検証結果をAIにまとめさせただけです。シンプルな備忘録だから許して。

Unity Animator の Exit Time で、遷移が 1 秒待たされる理由#

Unity の Animator で、遷移の Exit Time を 0 や 1 に設定すると、遷移に約 1 秒の待ち時間が発生することがあります。

この現象は、次のような設定で特に起こりやすくなります。

  • Exit Time を 0 または 1 にしている
  • 空のクリップや、1 フレームだけのクリップを使っている
  • ステートにクリップを割り当てていない

先に結論を書くと、Exit Time を「ほぼ 0」にしたい場合は、0 ではなく 0.00001 のような小さい正の値を指定します。

この記事で使う用語#

  • ステート: Animator Controller 上の、アニメーションの状態です。
  • クリップ: 実際に再生するアニメーションデータです。
  • 遷移: あるステートから別のステートへ切り替える処理です。
  • Has Exit Time: クリップの再生位置が Exit Time に達したとき、遷移条件を確認する設定です。
  • Exit Time: クリップをどのくらい再生した時点で遷移条件を確認するかを表す値です。

Exit Time は何を表すのか#

Exit Time は、クリップの再生割合を表します。たとえば、次のように考えられます。

Exit Time条件を確認するタイミング
0.25クリップを 25% 再生した時点
0.75クリップを 75% 再生した時点
1クリップを 100% 再生した時点

一見すると、0 は「再生開始直後」を意味しそうです。しかし、ここに注意点があります。

Exit Time = 0 は最初のフレームではない#

Unity のドキュメントには、Exit Time が 0 の場合、最初のフレームでは終了時間の判定が行われないと説明されています。

また、終了時間による判定は、基本的に指定したタイミングで一度だけ行われます。つまり、次のような流れになります。

  1. ステートの再生が始まる
  2. Exit Time = 0 なので、最初のフレームでは判定されない
  3. そのままクリップが最後まで再生される
  4. クリップがループし、再び判定タイミングに到達する

このため、Exit Time を 0 にしたのに、すぐ遷移せず、クリップを 1 周分待ったような挙動になることがあります。

なぜ 0.00001 にするのか#

0.00001 のような小さい正の値にすると、0 とは異なり、再生開始直後の判定対象になります。

そのため、意味としては「ほぼ 0」でも、Unity の判定上は「最初のフレームを除いた、非常に早いタイミング」として扱えます。

避けたい設定: Exit Time = 0
使える設定: Exit Time = 0.00001

参考:

クリップの長さを取得できないステートの場合#

次のようなステートでは、Unity がクリップの長さを正しく評価できないことがあります。

  • クリップが空
  • クリップが 1 フレームしかない
  • ステートにクリップが割り当てられていない

このようなステートから Has Exit Time を使って遷移する場合も、Exit Time の値に注意が必要です。

Exit Time = 0 や 1 で起こること#

「クリップが空なら、すぐ遷移するはず」と考えたくなります。しかし、実際には Transition Duration を 0 にしていても、遷移まで約 1 秒の空白が発生することがあります。

一方、Exit Time を 0.75 にすると、遷移までの時間も実際に約 0.75 秒まで短くなることが確認できます。

このことから、クリップの長さを評価できないステートでは、内部的に約 1 秒のクリップ長を使って Exit Time を計算していると考えられます。

まとめ#

  • Exit Time は、クリップの再生割合に応じて遷移条件を確認する値です。
  • Exit Time = 0 では、最初のフレームに判定が行われません。
  • すぐに遷移したい場合は、0 ではなく 0.00001 などの小さい正の値を使います。
  • 空のクリップ、1 フレームのクリップ、クリップ未設定のステートでは、内部的に約 1 秒として計算されることがあります。
  • Transition Duration = 0 にしても、Exit Time による待ち時間はなくなりません。