MRが楽しい

MRやVRについて学習したことを書き残す

Unityでシーンの再生時間の速度を早くしたりゆっくりにする その3(Unity内の総時間経過と実際の総時間経過を計測する)

本日は Unity の小ネタ枠です。
今回は TimeScale を使ってシーンの再生速度を変えた時、Unity 内の総時間経過と実際の総時間経過を計測する方法についてです。

前回記事

前回記事の続きです。
シーンの再生速度を変更する方法については以下の記事を参照ください。
bluebirdofoz.hatenablog.com

Time.time

アプリケーションの開始からの現在のフレームの開始時までの時間を返します。
Time.timeが取得する経過時間はTimeScaleの影響を受けます。
docs.unity3d.com

Time.unscaledTime

アプリケーションの開始からの現在のフレームの開始時までの時間を返します。
Time.unscaledTimeが取得する経過時間はTimeScaleの影響を受けません。
docs.unity3d.com

またunscaledTimeの経過時間はアプリが非アクティブの状態(ウィンドウの最小化など)でも進むため、注意が必要です。

動作確認

Time.deltaTime と Time.unscaledDeltaTime を使ってフレームごとに経過時間を計測するサンプルスクリプトを作成しました。
・UnscaledTest.cs

using UniRx;
using UnityEngine;

public class UnscaledTimeTest : MonoBehaviour
{
    void Start()
    {
        // 時間の進みを2分の1の速度にする
        Time.timeScale = 0.5f;
        
        // 5000フレーム後にログ出力を行う
        Observable.TimerFrame(5000)
            .Subscribe(_ => TimeTest())
            .AddTo(this);
    }

    public void TimeTest()
    {
        Debug.Log($"Time.time: {Time.time}");
        Debug.Log($"Time.unscaledTime: {Time.unscaledTime}");
    }
}

シーンを再生すると以下の通り、unscaled の方は現実の総経過時間が表示されます。