Quick answer: Time-driven Shader Graphs animate in the editor because the inspector continually redraws. In a build, if the shader variant or its keywords are stripped, the time uniform never reaches the GPU. Add the shader to Always Included Shaders, ship a Shader Variant Collection, and verify any cameras rendering the material are active.
Here is how to fix Unity Shader Graphs that animate via the Time node in editor but freeze on a still frame the moment you build the project. Your water surface ripples in Play mode and the asset preview, but in the standalone player it sits still. The shader compiled fine. The material exists. The time variable is just stuck at zero, or the variant that uses it never made it into the build.
The Symptom
A shader that uses the Time node (sine wave UV scroll, animated noise, color pulses) animates correctly when you press Play in the editor. After running Build And Run, the shader renders but does not animate. The static appearance matches what the editor showed at _Time = 0.
What Causes This
Shader stripping in URP/HDRP. SRP build stripping removes variants that the build process believes are unused. If your time-driven path lives in a keyword that the build never enabled, that variant is gone.
Shader not in Always Included Shaders. Materials only used at runtime (instantiated, not present in any scene) can be excluded from the build entirely. The shader is missing, the engine falls back to the error shader, which is unanimated.
Camera not rendering global time. Some custom render passes do not set _Time. Materials in those passes see zero.
Animation Mode disabled on UI materials. UGUI materials assigned to a CanvasRenderer require the canvas to redraw to push new shader uniforms. If the canvas is static (no dirty flag), time updates may not reach the material.
The Fix
Step 1: Add the shader to Always Included Shaders. Open Project Settings → Graphics → Always Included Shaders. Click the + and drag your time-using shader. This guarantees it survives stripping regardless of scene references.
Step 2: Build a Shader Variant Collection and warm it.
using UnityEngine;
public class VariantWarmer : MonoBehaviour
{
[SerializeField] private ShaderVariantCollection collection;
void Awake()
{
if (!collection.isWarmedUp) collection.WarmUp();
}
}
Capture variants by enabling Save to Asset in Project Settings → Graphics → Shader Loading, run through your scenes once, and the collection records what was used.
Step 3: Verify the time uniform with a debug overlay. Add a Float property named _DebugTime in the shader and bind it from a script:
void Update()
{
material.SetFloat("_DebugTime", Time.time);
}
If the override animates but Time node does not, the shader variant is the issue. If neither animates, the camera or render path is the issue.
Step 4: Disable shader keyword stripping for time-related keywords. In URP, open the URP Asset and enable Strict Shader Variant Matching. In HDRP, edit the shader stripping settings via HDRPShaderStripping.cs or use the project’s shader stripping config.
Step 5: Confirm the Sky/Camera renders normally. If your custom Render Feature uses a CommandBuffer that does not include built-in globals, set the time uniform manually:
var cmd = CommandBufferPool.Get("AnimatedPass");
cmd.SetGlobalVector("_Time", new Vector4(Time.time / 20f, Time.time, Time.time * 2f, Time.time * 3f));
context.ExecuteCommandBuffer(cmd);
CommandBufferPool.Release(cmd);
Unity’s built-in time vector packs _Time = (t/20, t, 2t, 3t). Match that layout if you replicate it manually.
UI Materials
For UGUI Image components, set Maskable off if not needed and ensure the Canvas’s Render Mode is Screen Space - Camera (rather than Overlay) when using cameras that drive global time. Force a redraw each frame on stuck UI materials:
graphic.SetMaterialDirty(); // Forces canvas update
Mobile Quirks
On Adreno GPUs, very large time values eventually lose precision and visible animations slow down or freeze. If your game has long sessions, modulo time with a large period in the shader: frac(_Time.y / 1000.0) * 1000.0. This keeps numerical precision high indefinitely.
“Time is a global. If the build strips it, mocks it, or never sets it, the shader sits still. Always Included Shaders + Variant Collection covers most cases.”
Related Issues
For other shader build issues, see Shader Variant Collection Missing. For URP-specific render issues, see URP Shader Not Rendering in Build.
Always Included Shaders. Variant Collection. Manual _Time in custom passes. The animation moves again.