In this installment of Video Game Audio – Under the hood, I will break down the Ambience System I designed for Eon Altar.
Eon Altar’s Ambience Design:
Eon Altar proved to be an interesting project in designing how to tackle the ambiences. Players are either ascending (first level) or descending into a temple trying to find the Eon Altar. I didn’t want to have one static ambience bed for the whole level. I wanted to give the player a sense of change when they explore the level. To do this I broke the Ambience Design into two parts; Ambience Beds and Ambience One shot sweeteners.
Ambience beds
Eon Altar’s level design for the most part has a linear progression. I divided the level into three Ambience Zones. Each Zone would have its own ambience bed.
You may notice the above screen shot shows the ambience zones overlap. I used the zones to send different events to the Ambience System. I used the Trigger Volume “On Enter” event to “prime” the next ambience bed (playing at 0db). When the players exited the original ambience zone I used the Trigger Volume “On Exit” to send an event to crossfade the current playing ambience bed and the “prime” ambience bed.
Once players were far enough into the ambience zone they would hit another volume trigger telling the Ambience System to switch Ambience Zone. Changing ambience zones would stop the ambiences from the previous zone.
In the video below will demonstrate the Ambiences bed system in action.
Ambience One Shot Sweetener
Now that I had the Ambience beds I needed to put life into the ambiences. I needed a way to play a set of sound groups at random locations and random intervals. So I built the Ambience One Shot Sweetener FSM.
What does this thing do?
Basically it plays a random sound at random locations.
Let me break down this FSM. When it starts I have a random wait variable, between 5 and 10 seconds in this particular demo. From there it goes to the select sound group and select variation stage. These actions pick a random sound group from a list between 5 and 10 different sounds, and then it picks one of the 5 variations of that sound bank. Now that a chosen sound is set to play we needed to find a location to play the sound. To do this we had to find the location of the Audio Listener.
What is the Audio Listener?
Unity uses a component called Audio Listener as the location on where the game is listening for the sound. Most games put the audio listener on either the main camera or the player itself. Eon is designed as a local co-op multiplier game so I decided that the main camera would be too far away and that no particular player should have the audio listener attached to them. I decided to build my own placement of the audio listener, positioning it above and in the center of the party.
This gives the game a wider spread of sound from the front speakers. Meaning the sound effects for the players on the far right would come from the right speaker and the far left players would have their sound come from the left speaker. The players in the center get their sound from the center speaker.
I now have a location on where to play the sound but I didn’t want the sound to always play on the same location of the audio listener each time. To generate a random location, I randomized a set of numbers for X, Y, and Z and added them to the X, Y, and Z coordinates of the audio listener.
I found that the sounds would play overtop each other. The random wait timer was not long enough or was too long depending on the type of sound. I needed to wait for the sound to play out before I started the process all over again.
This proved a little tricky, when I created this system as there was no PlayMaker Event to find the current playing sound group, and the length of the playing variation. I didn’t want to waste what precious little time I had with the programmer so I dove into PlayMaker and found that you can attach scripts to Variables. With selecting the sound group and variation I had everything I needed to get the sound group game object and by using Master Audio Dynamic Group Variation script I was able to get the length of the sound. I stored that as a delay variable and now it waits for the sound to finish playing before starting the process all over again.
Here is a video of the Ambience One Shot Sound Effect in action.