Unityでスローモーション演出やポーズ機能を実装する際、Time.timeScale を操作するのは一般的ですが、DOTweenでこれを行う場合には特有の注意点があります。
本記事では、**「timeScaleを0にするとアニメーションが止まる問題」の解決策と、「オブジェクトごとに時間の速さを変える方法」**について解説します。
1. DOTweenでTime.timeScaleを操作する際の注意点
問題:timeScaleを0にするとアニメーションが完結しない
DOTween.To() を使って Time.timeScale を 1.0 から 0.0 へ変化させるコードを書く場合、デフォルトの設定ではアニメーションが永遠に終わりません。
原因: DOTweenはデフォルトで Time.deltaTime を参照して動作します。timeScale を 0 に向かってアニメーションさせると、DOTween自身が進むための時間も 0 に近づいてしまうため、最終的に「時間が止まり、アニメーションも停止する」という状態に陥ります。
解決策:.SetUpdate(true) を使う。
この問題を回避するには、timeScale の影響を受けない Unscaled Time(現実の時間) を参照するように設定します。
この一行を追加することで、ゲーム内の時間が止まっていても、指定した秒数(上記例では1秒)で正確にアニメーションが完了します。
2. オブジェクトごとにTimeScaleを個別に変える方法
Unityの Time.timeScale はゲーム全体に影響を与えるグローバルな値です。「特定のキャラだけ速く動かす」といった個別制御は標準機能にはありませんが、以下の手法で代替可能です。
手法A:DOTweenの個別timeScale(Tween単位)
作成した Tween インスタンスに対して個別に速度倍率を設定できます。
手法B:AnimatorのSpeedプロパティ(アニメーション単位)
Animatorを使っている場合、再生速度をスクリプトから制御できます。
手法C:localTimeScaleを自作する(スクリプト制御)
Update() 内で移動などを計算している場合、独自の変数(localTimeScale)を掛けるのが最も確実です。
手法D:パーティクルの速度制御
まとめ
| 実装対象 | 推奨される方法 |
|---|---|
| ゲーム全体のポーズ・スロー | Time.timeScale + SetUpdate(true) |
| 特定のTween演出 | tween.timeScale |
| キャラの動作速度 | Animator.speed |
| 独自の移動ロジック | Time.deltaTime * localTimeScale |
Time.timeScale は非常に強力ですが、DOTweenと組み合わせる際は必ず「そのアニメーション自体が止まってしまわないか?」を意識し、必要に応じて .SetUpdate(true) を活用しましょう。



