Quick answer: Unreal PhysicalMaterial swapped at runtime but friction value still uses the old one? Physics body caches the material at spawn - call SetMaterial then RecreatePhysicsState.

Ice patch swaps the floor's PhysicalMaterial to low-friction. Player still grips the ice surface as if it were stone.

Recreate physics state

Floor->SetMaterial(0, IceMat);
Floor->RecreatePhysicsState();

Forces the cached PhysicalMaterial pointer to refresh.

Or set on the body directly

BodyInstance->UpdatePhysicalMaterials(). Lower-level; doesn't recreate the entire body state.

Verify in PVD

PhysX Visual Debugger shows per-body material. Connect during the swap to confirm the material actually updated.

“Physical materials cache. Cached state needs explicit invalidation.”

For dynamic-friction gameplay, prefer per-body friction overrides via SetFriction. Faster than swapping materials and no cache surprises.