top of page
< Back

Exploratorium

Game Description

A mini-open world exploration game that encourages you to explore to find the way out!

What I Worked On...

For this project I composed original music, did the sound design, implemented all sounds using Wwise, and programmed them into Unity. Additionally, I consulted on gameplay mechanics to make them more audio-centric

Music Composition



Music Systems

Day and Night Music

The Day/Night cycle, controlled in the lighting manager script, takes 6 minutes. In Wwise, the Day music is a set of 7 short tracks ranging from 5 secs to 30 seconds all in a playlist object. At the start of the game, the main motif plays and then the playlist alternates between 30-45 seconds of silence and of the 7 day tracks. The night music is a 3 minute long track that corresponds directly to the night cycle.

Both Day and Night playlists are in a switch container controlled by the music state group. The state is set to day at the beginning of the game, and using the event system in the lighting manager, the state is set to night a bit before the sun sets. When this day to night change happens, a transition segment is triggered and plays at the same tempo as the day rhythm. I cross-fade between whatever day track is playing and the transition segment and it connects seamlessly into the night music. This transition segment also allowed me to cleanly transition from the day tempo (80bpm) to the night tempo (72bpm). Since the night music is exactly 3 minutes long, I change the state from in the music track within Wwise, this transitions to the silent part of the day track playlist.

Star Shard Music

In the game there are 5 pieces of a star that you must obtain the complete the game. You can obtain a map that hints at their locations, but I wanted to support that discovery with spatialized sound and music. Each shard emits the shard theme using the AkAmbient script with an attenuation curve that increases the volume and and low pass filter the closer the player gets to the shard. Additionally, the ambient shard track is side chained against with the main track so that the ambient track smoothly overrides it.


Each of the 5 shards share the bass and a sampled kalimba pad, but swap between 5 different instruments respectively (cello, kalimba 1, kalimba 2, piano, and guitar). For organizational purposes (and slight over-optimizing), I placed all the variations in one music track in Wwise and placed the unique instruments in a switch track. This allowed me to call the same event on each shard and then associate each shard object with AkSwitch in Unity.



When the star shards are collected, a short stinger is played with the instruments from the already collected shards and the bass speeds up as more shards are collected. To achieve this, I made individual switch groups in Wwise for each shard so that the instruments can unmute in any order of collection. Additionally, the game manager has a counter for the collected stairs, so I set and RTPC/Switch combo to increase the bass speed not only on the stinger, but also on the ambient music for each star. The stinger is triggered using Wwise's Stinger system which allows it to be played at the next bar of the main ambient track.

public void starIncrement() { starCount++; starCountRTPC.SetGlobalValue(starCount); }

Endgame Music

When the second to last star shard is collected, I wanted to have a modified version of the star shard track play and the synth bass to speed up the closer a player got to the final shard. I had a few problems that I had to solve to accomplish this: I needed to know that the player had collected the second to last shard, where it was, when to play the cue, and how to speed up the bass as the player got closer.


On the ambient star shard music, I utilized Wwise’s callback system to call a method every measure checking to see if a player tried to collect the object, that way the destruction of the game object syncs up with the music. The method also checks the star collection count from the game manager and extends the number of method calls it takes to destroy the object after the player collects the 4th star. Once the 4th star is destroyed, a timer is triggered in the game manager.


StarIncrementTotal.cs
void callbackDestroy(){ if(readyToDestroy){ if (gameManager.starCount == 4){ timeToDestroy = 4; stopRegionMusic.Post(this.gameObject); } if (measureCountdown == timeToDestroy){ Debug.Log("ready to destroy"); readyToDestroy = false; if (timeToDestroy == 4){ gameManager.delayEndGame(); } GameObject.Destroy(gameObject); } else{ measureCountdown++; } } }
GameManager.cs
public void delayEndGame(){ timerEnable = true; } void Update(){ if(timerEnable == true){ endgameTimer += Time.deltaTime; if (endgameTimer > 2.0f){ endGame(); timerEnable = false; } }

In the game manager, once the timer finishes (which is manually synced to the star pickup stinger) the endGame() method is called and uses GameObject.FindWithTag to obtain the last star shard. This is crucial to the bass speeding up since I used Wwise’s built-in distance parameter that calculates the distance between the game object the event is called on and the listener (the player). I associated that parameter with a switch group and that switch group with the bass switch tracks in the end game music track.


GameManager.cs

private void endGame(){
	lastStar = GameObject.FindWithTag("star");
	stopMusic.Post(this.gameObject);
	endgameMusic.Post(lastStar);
	Debug.Log("We're in the endgame now");
}

Sound Design Systems

Footsteps and Movement

For the player movement sound effects, I implemented a 3 tiered system in Wwise and Unity. For the

first layer, in a switch container, I placed a random container with water sloshing sounds and another switch container with all dry land sounds. In Unity, I placed AkSwitch on scripts on the Water meshes, triggered on Trigger Enter and Exit, and checked "Use Other Objects" so that switch changes were local to the player game object. In the dry land switch container, I placed sound effects for the metal and rock objects and a final switch container for the terrain footsteps. Using a raycasting, I tagged all the rocks, metal objects, and the terrain mesh to set the switch accordingly. For the final terrain switch group, I had a script return the index for the dominant texture at the player coordinates. I set grass, leaves, dirt, and snow switches accordingly.

The footsteps wwise events are triggered on a timer whenever the player moves with checks to objects and the texture called beforehand.

Environment Zones

The whole map has 3 environmental zones: field, forest, and mountain top. The forest and mountains have a combo of sphere and box triggers that change the state to forest and mountain respectively using the AkState and Ak Trigger Enter scripts. When the player exits either triggers, the AkState changes the state to field.


The field ambient track is a Wwise blend track that uses an RTPC tied to the Lighting Manager script in unity. During the day, the wind ambience is louder and I programmed bird noises to randomly play every 10-50 seconds using a Wwise sequence object alternating between a random sfx container and a silence object. When the game turns to night, I decreased the wind volume (and applied a low pass filter), and I cross-faded between the bird noises to a looping bug noises track.


The forest removed the birds/bugs sounds and replaced the wind sound for one with rustling leaves. The mountain ambient track starts by removing all other environment sounds when the player enters the mountain area. Centered around the peaks of the mountains, I placed a sphere with the AkAmbient script that emits a wind whistling loop that gets louder the closer you get to the top of the mountain.

Water Ambiences

The river and ocean had unique audio solutions due to their shapes. For the river, I used Wwise's AkAmbient script on Large_Mode. This placed 6 empties over the course of the river that emitted a both a close and far river sound. The far sound has more of the white noise/rumble aspect, whereas the close sound features bird sounds, water trickling, and has more detail in general. The sounds were spatialized, but I increased the stereo spread the closer the player got to the river.


Due to the irregular shape of the ocean, I experimented with a script adapted from Audio Kinetics Wwise 301 tutorials. This allowed the sound to emit from the edges of the custom collider rather than the center of the mesh. Once the player actually arrives at the edge of the mesh, the ocean sound is spread to 100% so it sounds all encompassing. The ocean also had a script that would raise the height of the mesh to simulate waves. I put an if statement inside the method that changed the wave height and once it was over a certain threshold, I would call the ocean waves sound effect. I also put a check in that if statement to make sure the wave sound hadn't already been called yet. This boolean would reset once the waves dropped below the threshold again.


Both the river and the ocean ambiences were attenuated based on player distance to the emitters. I increased the volume and stereo spread and decreased a low pass filter to simulate objects in the distance getting closer.

© 2025 by Joshua Lowery

bottom of page