Skip to content

Physical Materials for Surface-Specific Feedback

The trace can tell you what surface it hit, but only if the query and the asset are set up to return that data. Physical Materials are the bridge between "I hit something" and "play the stone footstep, metal spark, or mud impact."

The one-minute version

  • A Physical Material is an asset that describes physical surface data for collision and hit results.
  • A project can label surface types such as SurfaceType1 = Stone or SurfaceType2 = Metal in project settings.
  • A hit result's Physical Material can be empty unless the trace/hit path requests it and the hit component/material supplies one.
  • Static meshes can return different physical materials depending on simple vs complex collision and overrides.
  • Skeletal meshes commonly get physical material data through their Physics Asset bodies.
  • Use surface type to choose feedback: footstep sound, impact Niagara, decal, damage type, camera shake, or controller rumble.

What a Physical Material is

A Physical Material is data attached to collision/material setup. For beginner feedback, the most important field is surface type:

PM_Stone -> Surface Type = Stone
PM_Metal -> Surface Type = Metal
PM_Mud   -> Surface Type = Mud

When a trace or hit result contains a physical material, your graph can map that material or surface type to feedback:

Surface.Stone -> footstep_stone, NS_StoneDust, M_Decal_Dust
Surface.Metal -> footstep_metal, NS_Spark, M_Decal_Scratch
Surface.Mud   -> footstep_mud, NS_MudSplash, M_Decal_Mud

The Physical Material is not the sound or particle effect. It is the surface data you use to choose those things.

How a hit result gets one

The simplified chain is:

Trace or hit query
-> collision/mesh/material setup
-> FHitResult.PhysicalMaterial, if requested and available
-> your graph chooses feedback

For traces, make sure the query is configured to return physical material data. In Blueprint trace nodes this may be an advanced input or project/version specific option. If you never request the data, the Physical Material field can be empty even when the asset is configured correctly.

For static meshes:

  • simple collision usually uses the mesh's simple collision physical material or component override;
  • complex collision can use the physical material from the rendered material or material instance;
  • component overrides can replace the simple-collision result.

For skeletal meshes:

  • physics bodies in the Physics Asset commonly provide the simple collision physical material;
  • bone/body setup matters more than the visible material slot for many physics queries.

That is why a surface bug often lives in asset setup, not in the Blueprint that breaks the hit result.

Choosing feedback

A first-project version can use a switch:

Break Hit Result
-> Physical Material
-> Get Surface Type
-> Switch on Surface Type
   Stone:
       Play Sound at Location Footstep_Stone
       Spawn Niagara System at Location NS_StoneDust
   Metal:
       Play Sound at Location Footstep_Metal
       Spawn Niagara System at Location NS_Sparks
   Default:
       Play Sound at Location Footstep_Default

As the list grows, move the mapping into data:

Map SurfaceType -> FSurfaceFeedback struct
    FootstepSound
    ImpactEffect
    DecalMaterial

or a Data Table/Data Asset setup:

Surface.Stone row:
    FootstepSound = S_Footstep_Stone
    ImpactEffect = NS_StoneDust
    DecalMaterial = M_Decal_Dust

The gameplay event stays the same; only the lookup changes.

When it fails

Symptom Likely cause Fix shape
Physical Material pin is empty Query did not request physical material, or asset has none. Enable return physical material on the trace/query and inspect asset setup.
Always gets default surface Surface type was never assigned or project settings labels do not match your switch/data. Check Physical Material asset and project surface type labels.
Static mesh returns different result than expected Simple vs complex collision reads different sources. Decide whether the query should use simple or complex collision.
Skeletal mesh surface is wrong Physics Asset body physical material differs from visible material. Inspect the physics body and simple collision material.
Multiplayer feedback differs Each client chose local feedback from different data/state. Replicate the hit/surface result or authoritative gameplay state.

Do not treat an empty physical material as impossible. Always provide a default feedback path.

What Physical Materials do not do

  • They do not play sounds or spawn effects by themselves.
  • They do not make a trace return surface data unless the query asks for it.
  • They do not apply damage.
  • They do not change collision responses by themselves.
  • They do not replicate impact events.
  • They do not replace Gameplay Tags for broad gameplay classification.
  • They do not make every mesh surface unique unless the asset/collision setup supports that detail.

The pattern everyone actually uses

For footsteps:

Animation Notify Footstep
-> line trace down from foot socket or character
-> Break Hit Result
-> get Physical Material / Surface Type
-> lookup footstep sound by surface
-> Play Sound at Location at foot location

For weapon impacts:

Server/client hit-scan pattern
-> Line Trace By Channel with physical material requested
-> Break Hit Result
-> choose impact VFX/decal/sound by surface type
-> apply damage separately after target filtering

For a small project:

Switch on EPhysicalSurface
-> SurfaceType_Default: default sound/effect
-> Stone: stone sound/effect
-> Metal: metal sound/effect

For a larger project:

Data Asset SurfaceFeedback_Stone
    SurfaceType = Stone
    FootstepSound
    ImpactEffect
    DecalMaterial

Map or Data Table chooses the asset by surface type

Lookalikes - which one do I want?

Tool Use when Watch out
Physical Material Collision/hit results need surface data. Query and asset setup must both support it.
Material / Material Instance You need visual shading and render parameters. Visual material is not always the physical material source.
Gameplay Tag You need broad gameplay labels such as Enemy.Undead. Tags do not automatically come from hit collision.
Data Table / Data Asset Surface type should map to sounds/effects/decals. The data chooses feedback; it does not detect the surface.
Line Trace By Channel You need a hit result from a ray. Enable/request physical material when needed.
Event Hit Blocking contact produced a hit result. Physical material availability still depends on the collision path.

Rule of thumb: collision finds the surface, physical material identifies it, data maps it to feedback.

Going deeper