
How to Make NPCs Look at the Player Only When Close (Unity Guide)
August 11, 2026
Samurai Mesh Cutting System | Free Unity Asset
August 18, 2026Footstep particles are an easy way to add realism and feedback to your characters.
Whether it’s dust kicking up on dirt, splashes on water, snow bursts, or sparks on metal — footstep effects dramatically increase player immersion.
This guide shows you how to create a clean, flexible, and professional footstep particle system for ANY character in Unity.
1. Overview
We will use:
- A Particle System prefab for each surface type
- A simple FootstepManager script
- Animation Events to trigger footsteps at exactly the right frame
- Optional: Raycasting to detect surface type automatically
This system works for:
- Third-person characters
- First-person controllers
- AI/NPC characters
- Any Humanoid animation
2. Create Footstep Particle Prefabs
Create one prefab per surface type, for example:
- Dust_Dirt
- Dust_Stone
- Snow_Burst
- Grass_Rustle
- Water_Splash
Recommended particle settings:
- Duration: 0.4–0.8
- Start Size: small (0.2–0.5)
- Gravity: 0.5–1.0
- Shape: small circle or cone
- Render Mode: Billboard
3. Add a Script to Spawn Particles
This script handles:
- Spawning the correct particle prefab
- Raycasting to identify the ground material
- Pooling for performance
using UnityEngine;
public class FootstepParticles : MonoBehaviour
{
public LayerMask groundMask;
[Header("Particle Prefabs")]
public GameObject dustPrefab;
public GameObject grassPrefab;
public GameObject snowPrefab;
public GameObject waterPrefab;
public void SpawnFootstep(Vector3 footPos)
{
if (Physics.Raycast(footPos + Vector3.up * 0.3f, Vector3.down, out RaycastHit hit, 1.0f, groundMask))
{
string tag = hit.collider.tag;
GameObject selected = null;
switch (tag)
{
case "Dirt":
selected = dustPrefab;
break;
case "Grass":
selected = grassPrefab;
break;
case "Snow":
selected = snowPrefab;
break;
case "Water":
selected = waterPrefab;
break;
}
if (selected != null)
{
GameObject fx = Instantiate(selected, hit.point, Quaternion.identity);
Destroy(fx, 2f); // auto-clean
}
}
}
}
4. Triggering Footsteps from Animation
Inside your walk or run animation:
- Select the animation clip
- Scroll to the Events section
- Add an event exactly when the foot hits the ground
- Enter the method name: SpawnFootL or SpawnFootR
Then add functions for left/right footsteps:
public void SpawnFootL()
{
Vector3 pos = leftFoot.position;
SpawnFootstep(pos);
}
public void SpawnFootR()
{
Vector3 pos = rightFoot.position;
SpawnFootstep(pos);
}
5. Finding Foot Bone Positions
public Transform leftFoot;
public Transform rightFoot;
void Start()
{
Animator anim = GetComponent<Animator>();
leftFoot = anim.GetBoneTransform(HumanBodyBones.LeftFoot);
rightFoot = anim.GetBoneTransform(HumanBodyBones.RightFoot);
}
This works for ALL Humanoid characters — Mixamo, Blender rigs, etc.
6. Setup Ground Tags (Very Important)
On every ground object, set:
- Tag = Dirt, Grass, Snow, Water
- A physics collider
This ensures the raycast detects surface type properly.
7. Optional: Add Sound + Particles
If you also want footstep sounds per surface:
public AudioSource audioSource;
public AudioClip dirtSound, grassSound, snowSound, waterSound;
void PlaySound(string tag)
{
switch (tag)
{
case "Dirt":
audioSource.PlayOneShot(dirtSound);
break;
case "Grass":
audioSource.PlayOneShot(grassSound);
break;
case "Snow":
audioSource.PlayOneShot(snowSound);
break;
case "Water":
audioSource.PlayOneShot(waterSound);
break;
}
}
8. Optional: Using Object Pooling
For high performance (mobile games especially), use pooling instead of Instantiate/Destroy:
- Use Unity’s built-in Pool API
- Or use your own PoolManager
This reduces GC spikes and improves FPS.
9. Optional: Different Effects for Running vs Walking
Stronger footsteps for running:
if (animator.GetFloat("Speed") > 0.6f)
fx.transform.localScale *= 1.4f; // stronger particle
Conclusion
Footstep particles are a small detail that massively improves the feel of your game.
With a simple raycast-based system, you can automatically spawn the correct visual effect based on the surface type — dirt, grass, snow, water, sand, concrete, anything.
Using animation events ensures perfect timing, and pooling keeps performance stable.










