TACTICAL AUDIO • C#
HOW TO CONTROL ENGINE SOUND WITH RPM IN UNITY
Create immersive, dynamic vehicle engine audio in Unity by smoothly interpolating AudioSource pitch and volume based on speed and RPM.
Quick Answer
Attach a looping engine audio clip to an AudioSource, calculate a normalized speed ratio float speedRatio = rb.linearVelocity.magnitude / maxSpeed, and interpolate audioSource.pitch = Mathf.Lerp(minPitch, maxPitch, speedRatio) inside Update() using Mathf.MoveTowards() or Mathf.Lerp().
1
Dynamic Engine Sound Controller Script
EngineAudioController.cs (C#)
using UnityEngine;
[RequireComponent(typeof(AudioSource))]
public class EngineAudioController : MonoBehaviour
{
[Header("Vehicle Reference")]
[SerializeField] private Rigidbody targetRigidbody;
[SerializeField] private float maxSpeedMps = 40f; // Approx 144 km/h
[Header("Pitch Tuning")]
[SerializeField] private float minPitch = 0.65f; // Idle sound
[SerializeField] private float maxPitch = 2.2f; // Redline RPM
[SerializeField] private float pitchSmoothRate = 3.5f;
[Header("Volume Tuning")]
[SerializeField] private float minVolume = 0.35f;
[SerializeField] private float maxVolume = 0.95f;
private AudioSource audioSource;
private float currentPitch;
private void Awake()
{
audioSource = GetComponent<AudioSource>();
audioSource.loop = true;
audioSource.playOnAwake = true;
if (targetRigidbody == null)
{
targetRigidbody = GetComponentInParent<Rigidbody>();
}
currentPitch = minPitch;
}
private void Start()
{
if (!audioSource.isPlaying)
{
audioSource.Play();
}
}
private void Update()
{
if (targetRigidbody == null) return;
// Calculate speed fraction between 0.0 (stopped) and 1.0 (top speed)
float currentSpeed = targetRigidbody.linearVelocity.magnitude;
float speedRatio = Mathf.Clamp01(currentSpeed / maxSpeedMps);
// Calculate target pitch and volume
float targetPitch = Mathf.Lerp(minPitch, maxPitch, speedRatio);
float targetVolume = Mathf.Lerp(minVolume, maxVolume, speedRatio);
// Smooth pitch transitions to avoid robotic jumps
currentPitch = Mathf.MoveTowards(currentPitch, targetPitch, pitchSmoothRate * Time.deltaTime);
audioSource.pitch = currentPitch;
audioSource.volume = targetVolume;
}
}
Audio Pitch Too Fast or Sound Not Playing?
Check out our audio troubleshooting articles: Pitch Too Fast Fix • Audio Not Playing Fix