Quick answer: Unity shader keyword set via EnableKeyword affecting other materials sharing the shader? Global keywords leak by design - use SetKeyword on per-material LocalKeyword instead.
Toggled _USE_NORMAL_MAP on one prop's material. Every material in the scene that uses the same shader now reads the normal map.
Use local keywords
material.SetKeyword(
new LocalKeyword(shader, "_USE_NORMAL_MAP"), true);Local keywords are per-material. EnableKeyword/DisableKeyword set the global keyword pool, which is shared.
Mark in shader graph
In Shader Graph blackboard, set Scope = Local. The generated shader uses local keyword qualifiers; runtime code can flip them per-material safely.
Audit with the inspector
Material > Debug > Active Keywords. Shows enabled keywords; check for unexpected globals leaking from elsewhere.
“Shader keywords have scope. Default global is the wrong choice for runtime state.”
Migrate existing shaders to local keywords over a sprint. The variant count drop is significant; the bug class disappears.