Joshua's Death Defying Adventure

Game Description
This was a short game project, developed by Ben Reyes, for the sole purpose of upending Joshua Lowery's life and making him obsessed with game audio.
What I Worked On...
For this project I composed original music, produced the sound design, implemented all sounds using Wwise, and programmed them into Unity in C#.
Music Composition
For this game I wanted to practice both horizontal and vertical variation. For the horizontal aspect, I composed 3 similar sections of music with the same melody but different harmony and accompaniment. The intro featured the melody with a slow build up to the end. The A and B sections were similar with the melody and accompaniment, but I altered the chord structured from major to the relative minor respectively. Additionally, I incorporated vertical variations through Wwise's random subtrack feature, adding alternate versions to the bass, synth, pad, and arpeggio.
Music Systems
Coin Music
I wanted to mix a bit of the music with the ambience and sound effects. To signify that the spinning coins were something worth inspecting (more than already being the only thing of potential interest in the grey box), I made a looping synth drone that played a high C which matched the key of the music in the game. To make sure that it was clear that the coins were emitting the audio, I attenuated the audio and made it emit in a specific direction so that the player could here it turn with the coin. I ran into one issue since Wwise emits the audio in the Z direction but the coins local rotation had the z pointing up not from the face. To solve this, I added an empty to the coin prefab and rotated it the correct direction.
Then the player collides with a coin, and using the AkTriggerEnter script played a pickup sound effect inspired by Super Mario Bros use of the music system for sound effects. The game object is destroyed on collision with the player so I use that to stop the drone as well.
Dynamic Music

I wanted to incorporate a subtle musical cue to indicate the player's proximity to the end of the level. Since the tracks already were using Wwise's sub tracks for vertical variation, I put two complete versions of the track inside a switch container and associated each with the appropriate state. Additionally, I made sure the internal A and B sections transitioned correctly to their corresponding sections by having Wwise jump to the specific playlist item and sync to the same time as playing segment. I then created a trigger collider in Unity and used AK Trigger Enter and AK Trigger Exit to change the global music state.
Sound Design Systems
Footsteps Sound Effects
I downloaded a set of stone and metal footstep recordings from pixabay.com and edited them into individual steps. I then imported them into respective random containers in Wwise, put those two containers into a switch containe
r, and associated them with the material switch group.
Since this was a first person game, there were no animation events to call the Wwise footstep events. Instead, I modified the developer's "First Person Controller" script to call the event on a timer
if (footstepTimer > footstepSpeed){ footsteps.SelectAndPlayFootstep(); footstepTimer = 0.0f; } footstepTimer += Time.deltaTime;
The script had an area to handle sprinting, so I had the "footstepSpeed" change as well.
if (_input.sprint){ targetSpeed = SprintSpeed; footstepSpeed = 0.2f; } else { targetSpeed = MoveSpeed; footstepSpeed = 0.3f; }
The material switcher was based off Alessandro Famà 's guide and uses a Raycast to detect the layer assigned to the objects beneath the player. All of platformer surfaces were assigned to either the "BLOCKS" or "STAIRS" layers. Every time a footstep event is called, the Wwise switch is value is assigned first and then the footstep sfx is called.
RaycastHit[] hit; hit = Physics.RaycastAll(transform.position, Vector3.down, 10.0f); foreach (RaycastHit rayhit in hit){ if (rayhit.transform.gameObject.layer == LayerMask.NameToLayer("Blocks")) { currentTerrain = CURRENT_TERRAIN.BLOCKS; } else if (rayhit.transform.gameObject.layer == LayerMask.NameToLayer("Stairs")) { currentTerrain = CURRENT_TERRAIN.STAIRS; } }


The jump sfx sequence needed 3 parts: muting the footsteps while in the air, triggering a jump sound, and triggering a landing sound. The script checked if the player was grounded, if they were, I called an event that unmuted the footsteps using a state group. I used jump grunting sounds from pixabay.com, and I just doubled the footstep sounds with a slight delay to produce the landing sounds.
if (Grounded){ wwiseEvent.UnMuteStepSound(); ... if (_input.jump && _jumpTimeoutDelta <= 0.0f) { // the square root of H * -2 * G = how much velocity needed to reach desired height _verticalVelocity = Mathf.Sqrt(JumpHeight * -2f * Gravity); wwiseEvent.PlayJumpSound(); } //if we are grounded after falling or jumping then falling, play landing sound if (startedFalling == true){ wwiseEvent.PlayLandingSound(); startedFalling = false; } }else{ wwiseEvent.MuteStepSound(); startedFalling = true; }
Respawn Sound Effects
Originally, once the player fell below a threshold, they would immediately respawn at the start of the game. However, with permission from the developer, I changed the script so that the player falling past the threshold triggers a sound effect and starts a timer. The sound effect was a rising "whooshing" sound that peaked when the timer finished and respawned the player.
Before
if(this.transform.position.y > -2.0f) { controller.Move(...) } else { PlayerDeath(); }
After
if(this.transform.position.y > -2.0f){ timeFall = 0f; controller.Move(...) } else { controller.Move(...) ResetSFX(); timeFall += Time.deltaTime; if(timeFall > 1.3f) { PlayerDeath(); timeFall = 0f; } }
Block Falling Sound Effects
There are a few special blocks in the game that after a player collides with them, a timer starts and then at the end of the timer the block begins to fall. When that timer starts, I attached an event call to a concrete crumbling sound. The sound effect has an attenuation sphere so that when it gets further from the player it has a natural fade out.