(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!

    

timeScaleを下げてスローモーションにした時に物理演算がカクカクする場合の対処法【Unity】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 2022.3.21f1


はじめに

UnityはTimeのtimeScaleを操作する事で簡単に時間の進みを変えられます。



ただし、この値のみを変えると物理演算で動いてる物の動きがカクカクします。

例えば以下のようにボールがバウンドしている時に、


timeScaleを0.1にすると、動きはスローになりますが、コマ送りみたいになります。


という事で今回は、timeScaleを下げてスローにした時にカクカクする場合の対処法の紹介です!



なお、記事中では以下のアセットを使っています。

Japanese School Gymnasium - Unity Asset Store


timeScaleを下げてスローにした時にカクカクする場合の対処法

そもそもTimeScaleはEdit/Project Settings…の、


Timeから変更が可能です。


そして、同じ場所にあるFixed TimeStepを下げる事でカクカクを解消出来ます。

(timeScaleと同じ倍率でFixed TimeStepも下げるとちょうどいい感じ)


なお、Fixed TimeStepは物理演算の間隔なので、

スローモーションが終わった後も下げっぱなしにすると負荷が上がるため、

スローモーションをやめる時(timeScaleを戻す時)に一緒に戻しましょう。

フレームレートに依存しないで、物理計算や FixedUpdate() イベントを実行する間隔。


プログラムから変える事も、もちろん可能です。

(プログラムだとFixed TimeStepはfixedDeltaTimeなので注意)

Time.timeScale = 0.1f;
Time.fixedDeltaTime = 0.002f;


ただし、Fixed TimeStepを変えるという事は物理演算の計算回数が変わるという事なので、

物理演算の結果が変わってしまう点には注意が必要です。(↓はバウンド後の高さが変わっている)


ちなみにFixed TimeStepを変えずに、RigidbodyのInterpolateを変更するという方法もあります。


Interpolateにすると、前フレームと現在の間で位置を補間をするため、動きが滑らかに見えます。

(Extrapolateだと次フレームを予測して補間)


こちらだと物理演算の結果は変わりませんが、あくまで補完なので、

場合によっては変な動きになるため、状況に応じて使い分ける必要があります。