読者です 読者をやめる 読者になる 読者になる

(:3[kanのメモ帳]

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

timeScaleに影響しない時間、unscaledDeltaTimeとunscaledTime【Unity】


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

この記事でのバージョン
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の場合です。


f:id:kan_kikuchi:20160201135259p:plain f:id:kan_kikuchi:20160201135316p:plain


確かに、unscaled~の方はtimeScaleに影響されずに動いてますね。


また、Time.timeは最初のUpdateの処理が始めってからの時間を計ってるっぽいのに対して、

Time.unscaledTimeは実行した瞬間から計ってるっぽいです。実機では未確認ですが。


おわりに

今回紹介した、unscaledDeltaTimeとunscaledTimeっていつからあったんですかね?

前はなかった気がするけど……、

たまたまNGUIのRealTimeというクラスを見つけて気付きました(:3っ)∋〜