URPのShader変数_Timeの実装について
前書き
Built-in Render Pipeline
とUniversal Render Pipeline
でShaderで使用できる_Time
の実装が違うらしいので調べてみました。
環境
Unity 2020.3.12f1
Universal RP 10.5.0
High Definition RP 10.5.0
Built-in Render Pipelineの_Time
ドキュメントを見てみると、ステージ(レベル)のロードからの時間(Time.timeSinceLevelLoad) と書かれています。
ここで言うステージはたぶんシーンのことを指すと思うので、シーンをロードすると毎回0から始まるようです。
Universal Render Pipelineの_Time
URPで_Time
を設定している箇所はRuntime/ScriptableRender.cs
のSetShaderTimeValues
関数で行っており、呼び出し元はExecute
関数です。
そこに設定するためのtime
変数の定義があります。
定義は以下の通りです。
#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に影響しないのでゲーム中に一時停止に時間を計りたい、アニメーションさせたい場合は良さそうかもしれません。
ただ、プラットフォームやハードウェア依存なので気を付ける必要がありそうです。
High Definition Render Pipelineの_Time
HDRPはRuntime/RenderPipeline/Camera/HDCamera.cs
のUpdate
関数で定義されています。
定義は以下の通りです。
#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と変わらないようです。
最後に
実装が異なっていましたが、あまり影響はなさそう雰囲気でした。
転載元
Discussion