この記事でのバージョン
Unity 5.3.1f1 Personal
はじめに
Update内で時間に影響する移動処理などを実装する時に以下のように
Time.deltaTimeを使って、前フレームからの時間を取得する事はよくあります。
private void Update () { _x += Time.deltaTime * XXX; }
ただこの場合、Time.timeScaleの数値を変更するとTime.deltaTimeにも影響が出るため、
timeScaleを0にして一時停止したら、動いてほしいアニメーションも動かない!
みたいな事になります。
こういう場合、Time. realtimeSinceStartupを使ってリアルタイムの経過時間を算出する
というのが常套手段だった気がするのですが、
いつの間にかTime.unscaledDeltaTimeなるものが追加されてました。
------------追記------------
ただし、使用にはちょっと注意が必要です。
------------追記おわり------------
unscaledDeltaTimeとunscaledTime
unscaledDeltaTimeとは名前の通り、timeScaleに影響されないdeltaTimeです。
また、unscaledTimeというtimeScaleに影響されないtimeもありました。
確認のため以下のようなコードを実行してみました。
private void Update () { Debug.Log ( "deltaTime " + Time.deltaTime + " : " + Time.unscaledDeltaTime + "\nTime " + Time.time + " : " + Time.unscaledTime ); }
結果は以下の通りで、左がtimeScale = 1の場合、右がtimeScale = 0の場合です。
確かに、unscaled~の方はtimeScaleに影響されずに動いてますね。
また、Time.timeは最初のUpdateの処理が始めってからの時間を計ってるっぽいのに対して、
Time.unscaledTimeは実行した瞬間から計ってるっぽいです。実機では未確認ですが。
おわりに
今回紹介した、unscaledDeltaTimeとunscaledTimeっていつからあったんですかね?
前はなかった気がするけど……、
たまたまNGUIのRealTimeというクラスを見つけて気付きました(:3っ)∋〜