A gunshot in a tiled bathroom should ring like a bathroom, even when you hear it from the hallway. One global reverb makes every room sound alike; a reverb that follows the listener makes that shot sound like the hallway. Pepper.SFX splits the two: a sound sends to the reverb of the room it’s played in, and each room’s reverb keeps its own character wherever you stand.
How it works
- A Reverb Send Bus asset is one acoustic space: a small room, a hall, a cave. It owns a mixer group with a reverb on it and holds the character: Room, Decay Time, Reverb Level and Unity’s other SFX Reverb settings, or an impulse response.
- An Audio Zone (from ambient propagation) routes: its Reverb Bus field says which bus the sounds inside it send to. Zones can share a bus; for two rooms that sound different, use two bus assets.
- A container opts in with Allow Reverb Send and sets Reverb Send Level Db: around 0 dB for a gunshot, nearer −12 dB for footsteps. The send is full when you’re in the same room, lower through an open door, lower again through a closed one, and right from the first frame.
- Explicit Reverb Bus ties a sound to one bus wherever it plays: a choir that always sounds like a cathedral, or a narrator.
- Ambient beds take the reverb of the room you’re standing in, through a Reverb filter on each ambient emitter. Its six values (an
AudioReverbProfile) come from that zone’s bus asset and crossfade through doorways.
Convolution reverb. Tick Use Convolution on a bus and it convolves the send with a real impulse response, a recording of an actual space, instead of using Unity’s parametric SFX Reverb. It runs in a native plugin built for 64-bit Windows only.
Example
A probe for checking your setup: which bus a spot sends to, and how long it rings.
using UnityEngine;
using AudioSystem;
using AudioSystem.Propagation;
public class ReverbProbe : MonoBehaviour
{
private readonly AudioReverbProfile character = new AudioReverbProfile();
[ContextMenu("Which reverb is here?")]
void Report()
{
var registry = AudioManager.Instance != null ? AudioManager.Instance.ReverbSendBusRegistry : null;
var zone = PropagationManager.HasInstance
? PropagationManager.Instance.GetZoneContainingPoint(transform.position) : null;
if (registry == null || zone == null || zone.ReverbBus == null) { Debug.Log("No reverb zone here"); return; }
ReverbSendBus bus = registry.FindByReverbBus(zone.ReverbBus);
if (bus == null) { Debug.Log($"{zone.name}'s bus isn't in the registry"); return; }
if (bus.UseConvolution) { Debug.Log($"{zone.name} sends to {bus.name} (convolution)"); return; }
bus.GetDefaultProfile(character); // the six values Pepper writes to the mixer
Debug.Log($"{zone.name} sends to {bus.name}: decay {character.DecayTime:0.0} s");
}
}
In Play mode, run it from the component’s menu in the Inspector.
Setting it up
Set up occlusion first: reverb sends use the same slots.
- Create > Audio System > Reverb Send Bus, named after the room (
Reverb_Bathroom). Assign Reverb Mixer (your voice mixer) and set Decay Time and Room. - In its Inspector, click Generate Mixer Group, then Validate Wiring, which should say “Wiring OK.”
- Create > Audio System > Reverb Send Bus Registry and assign it to the Audio Manager’s Reverb Send Bus Registry. In Window > Audio System > Reverb Send Buses, click Refresh to fill it.
- In Window > Audio System > Occlusion Layout, assign the registry and click Scan, Auto-Create, Refresh so every slot gets a Send to each bus. Repeat after adding a bus.
- On each Audio Zone, drag the bus asset’s Reverb Bus mixer group into the zone’s Reverb Bus field.
- On each container, tick Allow Reverb Send, set its level, and tick Static Emitter if the sound doesn’t move.
For convolution, tick Use Convolution, assign an Impulse Response clip with Load Type set to Decompress On Load or PCM, and generate again. To tune by ear, Apply Params → Mixer pushes the asset’s values to the mixer and Pull Params ← Mixer reads them back.
Good to know
- Convolution is 64-bit Windows only: the Windows editor and Windows x64 players. Everywhere else, including macOS, Linux, mobile and consoles, a convolution bus is silent and Unity may log an error at startup. Unless you only ship on 64-bit Windows, use parametric buses.
- Web builds have no reverb at all, parametric or convolution: Unity’s Web audio has no mixer effects or sends.
- Convolution in this version: the impulse response is fixed once loaded, a stereo one is mixed to mono, and ambient beds use the bus’s parametric values instead.
- A container’s bus needs slots in the Occlusion Layout, and the layout window only builds them for a bus with at least one Use Occlusion container.
- Automatic mixer setup has only been tested on Unity 6000.0.48f1.