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 = StoneorSurfaceType2 = Metalin project settings. - A hit result's
Physical Materialcan 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¶
- Line Trace By Channel - reading
FHitResult, including the Physical Material field. - Event Hit - blocking contact and hit-result fields.
- Spawn Decal at Location and impact feedback - placing marks from Impact Point and Impact Normal.
- Spawn Niagara System at Location / Attached - visual effects chosen from the same surface result.
- Data Tables vs Data Assets - moving surface-to-feedback mappings out of hard-coded switches.
- Official docs: Physical Materials, Line Trace By Channel, and FHitResult.
- Engine source (requires engine access - we do not reproduce it here):
UPhysicalMaterialinEngine/Source/Runtime/PhysicsCore/Public/PhysicalMaterials/PhysicalMaterial.h; hit-result storage inEngine/Source/Runtime/Engine/Classes/Engine/HitResult.h; collision query setup and hit filling through world collision code underEngine/Source/Runtime/Engine/Private/Collision/.