One thing I’ve been thinking about—and hinted towards it in my last post—is ear fatigue. It’s real, and it can sneak up on players. Too much repetition or overly dominant sounds can make someone tired of playing, even if the mechanics are solid. The challenge is balancing realism (your character is always moving, after all) with variety so the mix doesn’t wear people down.
That’s why I got really excited when I started integrating the sounds I made in the last post. While poking around the Audio Mixer under Window > Audio, I stumbled across something I hadn’t noticed before: the Audio Random Container. Somehow it had slipped under my radar, but finding it felt like a win—meaning less custom coding for me. Plus, the name immediately reminded me of Wwise’s Random Container, which is a staple in their audio toolkit. The great thing about random containers is they’re an excellent tool for fighting ear-fatigue.

Here’s how Unity’s version works: you drop a bunch of audio clips into the container, and every time it plays, it picks one at random. You can even set random ranges for volume and pitch. Yet another nice feature is this can be set to loop with randomized time intervals. That little bit of variation goes a long way—think footsteps or ambience, for example. Instead of hearing the same sound over and over, you get subtle differences that keep things fresh.
Wwise takes it further by letting you nest Random Containers and combine them with a Blend Container for deeper variation. My own custom setup isn’t quite as elegant, but with a manager that tracks my character’s “sud-state,” (yes that is “sud-state”) I’ve gone from silence to a lively set of sounds for my little friend’s movements.
Below is my class for calling out to specific sets of Audio Random Containers that also allows me to blend the calls together to layer the sounds together. In conjunction with a script called SudsStateManager.cs and PlayAudioContainerSounds.cs I can address each Audio Random Container to play at the appropriate times.
public class AudioCallOutContainer : MonoBehaviour
{
public string id;
public List<AudioResourceContainer> resources;
public Dictionary<string, AudioResourcePair> resourcesDict;
public void Awake()
{
resourcesDict = resources.ToDictionary(x => x.id, x => x.resourcePair);
}
[ProButton]
public void Populate()
{
foreach (var resource in resources)
{
AudioSource source = gameObject.AddComponent<AudioSource>();
resource.resourcePair.audioSource = source;
resource.resourcePair.audioSource.resource = resource.resourcePair.audioResource;
resource.resourcePair.audioSource.playOnAwake = false;
}
resourcesDict = resources.ToDictionary(x => x.id, x => x.resourcePair);
}
[ProButton]
public void PlaySource(string id)
{
resourcesDict[id].audioSource.Play();
}
}
[Serializable]
public class AudioResourcePair
{
public AudioSource audioSource;
public AudioResource audioResource;
}
[Serializable]
public class AudioResourceContainer
{
public string id;
public AudioResourcePair resourcePair;
}
So, the next step is fine-tuning—whether that’s tweaking the effects themselves or adjusting how they sit in the broader soundscape. It’s all about keeping the experience engaging without overwhelming the player’s ears.
**Update: Below is where it sits now with some more fine tuning.
