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.