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.