終わりが見えない
総プレイ時間は100時間を超えているのに未だにエルダの王になれない皆さんこんにちは。先日は足場の狭い高い塔を登ったり下りたりで1時間以上を費やし、地下の白いベールを被ったボスの撃破に2時間以上かかりました。時間溶けすぎ。
UnityのTimescale
Unityではゲーム中の一時停止などを行うときにTimeクラスのTimescaleの値を変更して各オブジェクトの動作を停止状態にしますが、このTimescaleはシーン内の時間に対して影響を及ぼすので、例えばオブジェクトの動きは止めてもUI等は動いてほしい場合にはTimescaleではなく、別の対処が必要となります。
オブジェクトがDOTweenを使って動いている場合やAnimationで動いている場合などは、それぞれのコンポーネントのspeed値を変えることで停止・加速等を実装できますが、Rigidbodyを使っている場合はPhysics.Simulateメソッドを使うのが正攻法とされているようです。
Physics.Simulate
Physics.Simulateは「指定した秒数分、Rigidbodyの物理演算を進める」事のできるAPIです。
通常は物理演算はTimescaleに従って進みますが、このAPIを使うと超高速もしくは超低速でRigidbodyの位置や向きを計算することになります。ただし、事前にPhysics.autoSimulationをfalseにしておくことが必須条件です。
また「指定した秒数分進めた」演算を行う場合は、周囲のオブジェクトとの接触判定をすっ飛ばす結果になることもあるので注意が必要です。
お試し
試しに下のような箱の中で弾む白いボールの挙動をPhysics.Simulateを使って超高速、超低速で移動させたりします。
前述のようにAwakeでPhysics.autoSimulationをfalseにしておき、FixedUpdateでPhysics.Simulateをコールしますが、Time.fixedDeltaTimeに係数を掛けた値を指定します。
この係数が1超過なら超高速、1未満なら超低速でRigidbodyの挙動が計算される事になります。
Rigidbodyだけが影響を受けていることが分かるように、経過時間を画面に表示させています。
また、前述のTime.fixedDeltaTimeにかけ合わせる係数はDOTweenのメソッドを使って変化させます。中央の赤いボールも白いボールが当たるとDOTweenを使って振動させます。
「Slow」ボタンを押すと全ての白いボールの動きがスローになり、「Fast」ボタンを押すと早くなることが分かります。
逆に、経過時間を示すテキストや赤いボールの振動には何も影響がないことも分かると思います。
このようにPhysics.Simulateを使うと、他のコンポーネントには影響せずRigidbodyだけが早くなったり遅くなったりできるので中々楽しい機能ですが、その分負荷が高いようです。
オブジェクト数がある程度絞られた場面で使う等、使用するにはある程度の考慮が必要です。