追記
2021/06/30:Time.realtimeSinceStartupの説明を変更しました。
2021/07/01:HDRPの定義を追加
2021/09/10:ShaderGraphのTimeの参考資料と説明を追加
前書き
Built-in Render Pipeline
とUniversal Render Pipeline
でShaderで使用できる_Time
の実装が違うらしいので調べてみました。
注意点
今回HDRPの_Time
の実装は見ていません。
追記しました。
環境
Unity 2020.3.12f1
Universal RP 10.5.0
High Definition RP 10.5.0
Built-in Render Pipelineの_Time
ドキュメントを見てみると、ステージ(レベル)のロードからの時間と書かれています。
ここで言うステージはたぶんシーンのことを指すと思うので、シーンをロードすると毎回0から始まるようです。
docs.unity3d.com
Universal Render Pipelineの_Time
ここに自動生成される際の実装コードのサンプルがあるでこちらを見たほうが早いです。
docs.unity3d.com
URPで_Time
を設定している箇所はRuntime/ScriptableRender.cs
のSetShaderTimeValues
関数で行っており、呼び出し元はExecute
関数です。
そこに設定するためのtime
変数の定義があります。
github.com
定義は以下の通りです。
#if UNITY_EDITOR float time = Application.isPlaying ? Time.time : Time.realtimeSinceStartup; #else float time = Time.time; #endif float deltaTime = Time.deltaTime; float smoothDeltaTime = Time.smoothDeltaTime; ... SetShaderTimeValues(cmd, time, deltaTime, smoothDeltaTime);
コードを見ると、エディタ上ではプレイ中だとTime.time
、非プレイ中だとTime.realtimeSinceStartup
を入れています。
エディタ上でない場合はTime.time
を入れています。
確かに_Timeの実装が異なっているが確認できます。
おまけ:Time.realtimeSinceStartupって何?
名前の通りですが、アプリケーションを起動してからの時間です。
Time.timeScaleに影響しないのでゲーム中に一時停止に時間を計りたい、アニメーションさせたい場合は良さそうかもしれません。
ただ、プラットフォームやハードウェア依存なので気を付ける必要がありそうです。
docs.unity3d.com
High Definition Render Pipelineの_Time
HDRPはRuntime/RenderPipeline/Camera/HDCamera.cs
のUpdate
関数で定義されています。
github.com
定義は以下の通りです。
#if UNITY_EDITOR newTime = Application.isPlaying ? Time.time : Time.realtimeSinceStartup; deltaTime = Application.isPlaying ? Time.deltaTime : 0.033f; #else newTime = Time.time; deltaTime = Time.deltaTime; #endif time = newTime; lastTime = newTime - deltaTime;
time
変数が_Time
に代入されている値です。
実装自体はURPと変わらないようです。
最後に
実装が異なっていましたが、あまり影響はなさそう雰囲気でした。