Overview
StepSense is a complete footstep system for Unreal Engine. It works with any Character, any Pawn and even plain actors, on any skeleton, with or without footstep notifies.
- StepSense Footstep notify: place it where a foot touches the ground; it traces down from the foot bone.
- StepSense Profile data assets: per surface type or physical material - sounds, volume and pitch ranges, footprint decal, particle and a VFX tag.
- Automatic stepping: no notifies needed - a speed-based stride with alternating feet.
- Jumps and landings scaled by the fall velocity.
- Loudness from speed and stance (walk, run, crouch, sneak).
- Surface override volumes for puddles, snow, carpets and shallow water.
- Footprint decals with lifetime, fade and a world-wide pool that removes the oldest first.
- Left/right feet with mirrored right-foot decals and per-foot offsets.
- AI hearing: every step is a noise event for AI Perception or Pawn Sensing.
- Per-character profiles layered over the project's default profile.
- Throttle: minimum interval per foot, sound limits per character and per world.
- Wet and dirt trails after leaving a surface.
- Events for Blueprint and C++, a Blueprint library and the
StepSense.Debugconsole variable.
Requirements
| Requirement | Details |
|---|---|
| Unreal Engine | 4.27 and 5.8 |
| Modules | StepSense (Runtime) |
| Dependencies | None. Engine modules only (Engine, PhysicsCore, DeveloperSettings, AIModule); no other plugin is enabled. |
| Surfaces | Physical surface types (Project Settings > Physics > Physical Surface) assigned to physical materials |
| Platforms | Win64 and Mac (the module lists these platforms in the plugin descriptor). The code is platform-independent engine C++ with no OS-specific calls. |
| Network Replicated | No. Footsteps are cosmetic and play on every machine that runs the character; sounds, decals and particles are skipped on dedicated servers. AI noise is reported where the owner has authority. |
Installation
- Install StepSense from Fab into your engine, or copy the
StepSensefolder into your project'sPluginsfolder. - Enable StepSense in Edit > Plugins and restart the editor.
- C++ only: add
PublicDependencyModuleNames.Add("StepSense");to yourBuild.cs.
Quick start
- In Project Settings > Physics > Physical Surface name a few surface types (Grass, Wood, Metal, Snow). Create physical materials with those surface types and assign them to your floor materials, meshes or landscape layers.
- Create a profile: Add > Miscellaneous > Data Asset > StepSense Profile. Add one entry per surface with a Footstep Sound and optionally a Decal, and one entry with Surface = Default as the fallback.
- In Project Settings > Plugins > StepSense set Default Profile to it.
- Add the StepSense component to your character Blueprint.
- Open the walk and run animations, right-click a notify track, Add Notify > StepSense Footstep on every frame a foot lands, and set Foot to Left or Right. No time for notifies? Set the component's Step Mode to Automatic instead.
- Play and type
StepSense.Debug 1in the console to see traces, surfaces and loudness.
1. Footstep notify
Anim Notify UStepSenseNotify — displayed as StepSense Footstep. Its title on the track is Step L / Step R (plus the bone when set).
| Property | Default | Description |
|---|---|---|
| Foot | Left | Foot that touches the ground. |
| Bone Name | None | Bone or socket the trace starts from. None = the component's Left/Right Foot Bone (foot_l / foot_r when the owner has no component). |
| Loudness Multiplier | 1 | Loudness of this step: 0.5 for a toe tap, 1.5 for a stomp. |
| Spawn Footprint | On | Leave a footprint for this step. |
| Preview In Editor | On | Play steps in the animation editor preview. |
| Preview Profile | None | Profile used when the owner has no StepSense component (animation editor, simple actors). None = the default profile. |
When the owner has a StepSense component, the notify hands the step to it: throttle, loudness, trails, AI noise and events all apply. Without a component it traces from the bone and plays the step directly through Play Step At Location.
2. Surface profiles
Data Asset UStepSenseProfile — Add > Miscellaneous > Data Asset > StepSense Profile. Properties: Surfaces (array of entries) and Parent Profile (see Profile layering).
An entry is matched by its Physical Material first (when set), then by Surface, then the entry whose Surface is Default is used as the fallback.
struct FStepSenseSurfaceEntry
| Field | Default | Description |
|---|---|---|
| Surface | Default | Surface type of the entry. |
| Physical Material | None | When set, the entry is used only for this physical material and wins over surface-type entries. |
| Footstep Sound / Jump Sound / Land Sound | None | Any sound asset (Sound Wave, Sound Cue...). Jump and Land fall back to Footstep Sound. |
| Volume Min / Volume Max | 0.9 / 1.0 | Random volume range, before loudness scaling. |
| Pitch Min / Pitch Max | 0.95 / 1.05 | Random pitch range. |
| Attenuation / Concurrency | None | Optional overrides for the sounds of this surface. |
| Loudness Multiplier | 1 | Surface loudness: scales volume and AI noise (snow 0.5, metal grating 1.5). |
| Decal | None | Footprint decal material (Deferred Decal domain). |
| Right Foot Decal | None | Optional separate right-foot decal; when empty the left one is mirrored. |
| Decal Size | (10, 8, 14) | Decal box: X = projection depth, Y = half width, Z = half length along the walking direction (cm). |
| Decal Lifetime / Decal Fade Duration | 10 / 2 s | Seconds before the print fades, and the fade time. Lifetime 0 = the print stays until the pool removes it. |
| Particle / Particle Scale | None / 1 | Optional Cascade particle effect spawned at the step, aligned to the ground normal. |
| VFX Tag | None | Free tag passed in the step info so Blueprints can choose their own effect, for example a Niagara system. |
| Trail Footprints / Trail Decal / Trail Strength Parameter | 0 / None / None | See Wet & dirt trails. |
3. Automatic stepping
Set Step Mode on the component:
| Step Mode | Behaviour |
|---|---|
| Anim Notifies (default) | Steps come from StepSense Footstep notifies only. |
| Automatic | Steps are generated from the horizontal distance travelled on the ground, alternating left and right. Notifies are ignored. |
| Hybrid | Automatic stepping, suspended while notifies fire: it resumes Hybrid Notify Timeout (0.6 s) after the last notify. Use it when only some animations have notifies. |
Stride = Base Stride (40) + speed × Stride Speed Factor (0.12), clamped to Min Stride (40) - Max Stride (140) cm, times Crouch Stride Scale (0.75) while crouched. At 300 cm/s that is 76 cm, at 600 cm/s 112 cm. Below Min Auto Step Speed (20 cm/s) or in the air no step is generated; the first step after starting to move comes after half a stride. With Use Foot Bones In Automatic Mode (on) the trace starts at the foot bones when the mesh has them, otherwise at the bottom of the actor, Foot Spacing (12 cm) to each side.
Automatic stepping works for any actor whose velocity moves it, also on simulated proxies and dedicated servers (where the animation may not tick). Get Stride Length returns the current stride.
4. Jumps & landings
On a Character the component binds Landed and Movement Mode Changed automatically:
- Landing: the highest downward speed of the fall is measured. Below Min Landing Speed (250 cm/s) nothing happens. Intensity = (speed - Min) / (Max Landing Speed (1200) - Min), clamped 0-1. Loudness is multiplied by Lerp(1, Max Landing Loudness (2.5), Intensity), so hard landings are louder and carry further for AI. The surface's Land Sound and particle play at the ground, and with Landing Footprints (on) both feet leave a print.
- Jump: leaving the ground (Walking to Falling) with an upward speed of at least Min Jump Speed (100 cm/s) plays the surface's Jump Sound with loudness × Jump Loudness (0.8).
Simulated proxies in multiplayer do not always receive Landed; StepSense then uses the movement mode change (Falling to Walking) instead, never both. Turn the features off with Landing Effects / Jump Effects. For pawns that are not Characters call Trigger Landing (impact speed) and Trigger Jump yourself; Trigger Landing ignores the Landing Effects switch but respects Min Landing Speed.
5. Speed- and stance-based loudness
Every step gets a loudness value used for the volume, the AI noise and the events:
Loudness = Stance multiplier x Speed factor x Surface Loudness Multiplier x Notify Loudness Multiplier x Loudness Scale
| Stance | Selected when | Multiplier (default) |
|---|---|---|
| Sneak | Sneaking is on (Set Sneaking), or the speed is at most Sneak Speed Threshold (0 = off) | Sneak Loudness 0.25 |
| Crouch | the movement component is crouching | Crouch Loudness 0.5 |
| Run | speed ≥ Run Speed Threshold (450 cm/s) | Run Loudness 1.5 |
| Walk | otherwise | Walk Loudness 1.0 |
Speed factor = Lerp(Min Speed Loudness (0.5), 1, speed / Loudness Reference Speed (600)), or the value of Speed Loudness Curve (speed → factor) when set. With Loudness Affects Volume (on), the sound volume is the random volume × loudness clamped to Max Volume Scale (1.5) × Volume Scale (1). Get Stance, Get Speed and Get Current Loudness expose the values.
6. Surface override volumes
Volume AStepSenseSurfaceVolume — Place Actors > Volumes > StepSense Surface Volume. Steps whose ground point lies inside it use the volume's surface instead of the detected one: puddles on asphalt, snow drifts, carpets, shallow water.
| Property | Default | Description |
|---|---|---|
| Override Enabled | On | Off = the volume is ignored. |
| Surface | Default | Surface used inside. |
| Physical Material | None | When set, used instead of Surface (its surface type, and physical-material entries match it). |
| Override Priority | 0 | When volumes overlap, the highest priority wins. |
| Use Custom Entry / Custom Entry | Off | Use this entry's sounds, footprint and effect inside the volume instead of looking the surface up in the profiles. |
Make the volume reach a little above and below the ground. Volumes register when play begins. Contains Location and Get Override Surface are available in Blueprint; Find Surface Volume returns the volume at a location.
7. Footprint decals & pool
Each step spawns the surface's Decal at the ground point, projected along the ground normal and pointing in the actor's facing direction (rotate it with Footprint Yaw Offset to match your texture). After Decal Lifetime seconds the print fades over Decal Fade Duration and is destroyed.
Every print enters a per-world pool limited to Max Footprints (64, project settings). When the pool is full, the oldest print is removed. Change the limit at runtime with Set Max Footprints on the StepSense subsystem; 0 disables footprints.
Turn prints off per character with Spawn Footprints, or per notify with Spawn Footprint. No decals are spawned on dedicated servers.
8. Left/right feet, mirroring and offsets
- Notifies carry their Foot; automatic stepping alternates Left, Right, Left... and continues from the last notified foot in Hybrid mode.
- Left Foot Bone / Right Foot Bone (
foot_l/foot_r) are the bones or sockets traced from. - Left Foot Offset / Right Foot Offset (0, 0, 0) shift each foot's trace and print in actor space (X forward, Y right, Z up).
- Mirror Right Footprint (on): right-foot prints use the left decal mirrored across the walking direction, unless the surface entry has a Right Foot Decal.
- Each foot has its own Min Step Interval timer (see Throttle).
9. AI hearing
Every footstep, jump and landing can be reported as a noise:
| Noise Mode | Heard by |
|---|---|
| AI Perception (default) | UAISense_Hearing::ReportNoiseEvent: AI Perception components with an AI Hearing sense config. |
| Make Noise | AActor::MakeNoise: Pawn Sensing through a Pawn Noise Emitter component on the character (and AI Perception when a hearing sense is configured). |
| None | No noise. |
Noise loudness = step loudness × Noise Loudness Scale (1). Range = Noise Max Range (1500 cm), multiplied by the loudness when Scale Noise Range By Loudness is on; 0 lets the listener's hearing range decide. The noise carries Noise Tag (Footstep) and the owner as instigator. With Noise Only On Authority (on) noise is reported only on the server or in standalone, where AI runs. A sneaking character on snow is therefore far quieter than a running one on metal.
10. Per-character profile layering
Surfaces are looked up in this order, the first match wins:
- the Custom Entry of a surface volume (when enabled);
- the component's Profile, then its Parent Profile chain;
- the Default Profile of the project settings, then its parents.
Within that chain a physical-material entry wins over a surface-type entry, and the Default surface entry is the last fallback. A heavy robot therefore only needs a profile with its own Metal and Concrete entries; every other surface still comes from the project's default profile. Switch at runtime with Set Profile (armour on, barefoot...). Find Surface Entry shows which entry a character would use.
11. Throttle & concurrency
| Setting | Default | Effect |
|---|---|---|
| Min Step Interval (component) | 0.15 s | A foot cannot step again within this time; extra notifies are dropped. |
| Max Simultaneous Sounds (component) | 4 | Step sounds of this character playing at once (0 = unlimited). Further steps are silent but still leave prints, noise and events. |
| Max Step Sounds (project settings) | 24 | StepSense sounds playing at once in the world, all characters together. Runtime override: Set Max Step Sounds on the subsystem. |
Each entry can also set a Sound Concurrency asset for engine-level voice limiting.
12. Wet & dirt trails
Give an entry Trail Footprints > 0 (for example Mud = 6). After the character leaves that surface, the next N footprints on other surfaces use the mud entry's Trail Decal (or its Decal when empty) instead of the new surface's print. Stepping back onto mud ends the trail; leaving another trail surface starts a new one.
When Trail Strength Parameter is set (for example TrailStrength), each trail print gets a dynamic material with that scalar going from 1 on the first print down towards 0 on the last, so the trail can fade out step by step. The step info's Trail Footprint flag marks trail prints. Get Remaining Trail Footprints and Clear Trail (for example after walking through water) are on the component.
13. Events
| Event | Parameters |
|---|---|
| event On Footstep | Foot, Surface, Location, Normal, Loudness, Step |
| event On Landed | Surface, Location, Normal, Impact Speed, Intensity (0-1), Step |
| event On Jumped | Step |
struct FStepSenseStepInfo (Step): Event Type (Footstep / Jump / Landing), Foot, Surface, Surface Name, Physical Material, Location, Normal, Loudness, Speed (impact speed for landings), Stance, From Notify, Trail Footprint, VFX Tag, Volume, and the spawned Audio, Footprint and Particle components (null when none). Get Last Step returns the latest one.
14. Blueprint library
Function Library UStepSenseLibrary — category StepSense.
| Node | Type | Description |
|---|---|---|
| Trace Surface (Location, Trace Channel, Trace Up 30, Trace Down 80, Ignore Actor, Trace Complex, Apply Volumes) | call | Traces down at a location and returns a Surface Hit: hit flag, surface, surface name, physical material, location, normal, actor, component, override volume. |
| Get Surface Name | pure | The surface's name from the physics project settings ("Default" for the default surface). |
| Get Surface From Hit | pure | Surface type of any hit result. |
| Play Step At Location (Location, Profile, Foot, Facing Yaw, Loudness, Spawn Footprint) | call | Traces the ground and plays that surface's sound, print and particle. No throttle and no noise. |
| Play Surface Step | call | The same for an already traced Surface Hit. |
| Report Step Noise (Location, Loudness, Instigator, Max Range, Tag, Mode) | call | Reports a noise to AI (see AI hearing). |
| Find Surface Entry | pure | Entry for a surface in a profile chain plus the default profile. |
| Get Default Profile | pure | The default profile of the project settings. |
| Find Surface Volume | pure | Override volume at a location. |
| Clear All Footprints | call | Removes every StepSense footprint in the world. |
Profiles also offer Find Entry (Surface, Physical Material, Include Parents).
15. Debugging
Console variable StepSense.Debug (development and debug builds; nothing is drawn in shipping builds):
| Value | Output |
|---|---|
0 | Off (default). |
1 | Draws every surface trace (green to the hit point, red when nothing was hit), a sphere sized by loudness at each step (blue left, orange right) with the surface name and loudness, and prints [StepSense] Step L Grass loudness 0.82 Run speed 480 on screen, marked (trail) or (volume) when relevant. |
2 | As 1, and also writes each line to the LogStepSense log category. |
Component reference
Component UStepSenseComponent — displayed as StepSense. Add it to any actor; on a Character it uses the Character mesh, otherwise the first skeletal mesh of the owner (Set Foot Mesh to change).
| Category | Properties (defaults) |
|---|---|
| Profile | Profile (None) |
| Stepping | Step Mode (Anim Notifies), Hybrid Notify Timeout (0.6), Base Stride (40), Stride Speed Factor (0.12), Min Stride (40), Max Stride (140), Crouch Stride Scale (0.75), Min Auto Step Speed (20), Use Foot Bones In Automatic Mode (on) |
| Feet | Left Foot Bone (foot_l), Right Foot Bone (foot_r), Left / Right Foot Offset (0,0,0), Foot Spacing (12) |
| Trace | Trace Channel (Visibility), Trace Complex (on), Trace Up (30), Trace Down (80) |
| Loudness | Walk (1), Run (1.5), Crouch (0.5), Sneak (0.25) Loudness, Run Speed Threshold (450), Sneak Speed Threshold (0), Loudness Reference Speed (600), Min Speed Loudness (0.5), Speed Loudness Curve (None), Loudness Scale (1), Loudness Affects Volume (on), Max Volume Scale (1.5), Sneaking (off) |
| Landing | Landing Effects (on), Min Landing Speed (250), Max Landing Speed (1200), Max Landing Loudness (2.5), Landing Footprints (on), Jump Effects (on), Min Jump Speed (100), Jump Loudness (0.8) |
| Effects | Play Sounds (on), Spawn Particles (on), Spawn Footprints (on), Mirror Right Footprint (on), Footprint Yaw Offset (0), Volume Scale (1) |
| Throttle | Min Step Interval (0.15), Max Simultaneous Sounds (4) |
| AI Noise | Noise Mode (AI Perception), Noise Loudness Scale (1), Noise Max Range (1500), Scale Noise Range By Loudness (on), Noise Tag (Footstep), Noise Only On Authority (on) |
| Node | Type | Description |
|---|---|---|
| Trigger Footstep (Foot, Loudness Multiplier) | call | Plays a step of a foot now (throttle applies). |
| Trigger Footstep From Bone (Foot, Bone, Mesh, Loudness Multiplier, Spawn Footprint) | call | Same, traced from any bone or socket. |
| Trigger Landing (Impact Speed) / Trigger Jump | call | Manual landings and jumps for pawns that are not Characters. |
| Set Sneaking / Set Profile / Set Foot Mesh | call | Runtime changes. |
| Get Stance / Get Speed / Get Current Loudness / Get Stride Length | pure | Current state. |
| Get Last Step / Get Foot Mesh / Get Foot Bone / Find Surface Entry | pure | Queries. |
| Get Remaining Trail Footprints / Clear Trail | pure / call | Trail state. |
Settings & subsystem
Developer Settings UStepSenseSettings — Project Settings > Plugins > StepSense (saved in DefaultGame.ini): Default Profile (None), Max Footprints (64), Max Step Sounds (24).
World Subsystem UStepSenseSubsystem — one per world (game, PIE, editor and editor preview worlds): Find Volume At, Get Footprint Count, Clear Footprints, Set / Get Max Footprints, Get Active Step Sound Count, Set / Get Max Step Sounds (negative = back to the project setting).
C++
#include "StepSenseComponent.h"
#include "StepSenseLibrary.h"
// React to every step
Steps->OnFootstep.AddDynamic(this, &AMyCharacter::HandleFootstep);
void AMyCharacter::HandleFootstep(EStepSenseFoot Foot, TEnumAsByte<EPhysicalSurface> Surface,
FVector Location, FVector Normal, float Loudness, const FStepSenseStepInfo& Step)
{
if (Step.VFXTag == TEXT("Splash")) { /* spawn your Niagara system at Location */ }
}
// Stealth
Steps->SetSneaking(true);
// One-off step anywhere
FStepSenseStepInfo Step;
UStepSenseLibrary::PlayStepAtLocation(this, GetActorLocation(), nullptr, Step, EStepSenseFoot::Left, GetActorRotation().Yaw);
C++ helpers on the library: ResolveEntry, SpawnStepEffects (with FStepSenseSpawnRequest), MakeFootprintRotation, FillSurfaceHit, ApplySurfaceVolume; on profiles: GetProfileChain, FindInChain.
Troubleshooting
| Symptom | Cause and fix |
|---|---|
| No steps at all | Check Step Mode: with Anim Notifies the animations need StepSense Footstep notifies. Try StepSense.Debug 1: red traces mean the ground was not found - raise Trace Down or check the Trace Channel. |
| Every surface plays the Default entry | The hit has no physical material with that surface type. Assign physical materials to the floor materials or landscape layers. With Trace Complex on, the material's physical material is used; with it off, the collision body's. |
| Steps play in the editor but not in a packaged game | The project-settings Default Profile is a soft reference and is not cooked by itself: reference the profile from a component or notify, or add its folder to Additional Asset Directories to Cook. |
| Footprints vanish instead of fading | Add a Decal Lifetime Opacity node to the decal material. |
| Footprints point the wrong way | Set Footprint Yaw Offset (90, -90 or 180) to match the texture. |
| Double steps | Blended animations both fire notifies: raise Min Step Interval. In Hybrid mode, increase Hybrid Notify Timeout. |
| AI does not hear the steps | The AI needs an AI Perception component with an AI Hearing sense config (or Pawn Sensing plus a Pawn Noise Emitter on the character with Noise Mode = Make Noise). Noise is reported on the server only by default. |
| No landing sound | The fall was slower than Min Landing Speed, or the owner is not a Character (call Trigger Landing). |
Credits
© 2026 Alpha XP — alphaxp.net · Support: support@alphaxp.net. Built for Unreal Engine 4.27 and 5.8.