I Am Fish is a charming, physics-based adventure which sees the player take the fortunes of four intrepid fish friends into their hands as they try to escape for the sea. It was developed by London-based Bossa Studios and is a spiritual successor to their earlier hit I Am Bread. The game features a variety of bizarre physics-based vehicle audio, dynamic music, a bunch of systems to handle water (would you believe), as well as the challenge of making the player feel like four very different fish. The audio designer for the project, Ali Tocher at LookListen Audio, was asked by Audiokinetic to share a few tricks, tips and takeaways from using Wwise on the game.
So let’s dive in! (Sorry, I will try to keep piscine puns to a minimum, but they were a mainstay on our team slack so I might have to Plaice a few in [groan])
Dynamic Vehicle Audio
I Am Fish lets the player/fish control some unusual and bizarre vehicles which were a blast to make sounds for. Mop buckets, dumpsters, observation tanks, beer glasses, mine carts, large jars, a spherical fish bowl, luggage, a cube of ice, an inebriated human male and more! I wanted to share a couple of details on the design and usage of Wwise for two of these.
Spherical Glass Fish Bowl
The fish bowl audio needed to be readable at both very low speeds but could also reach very fast speeds for a decent amount of time. Initial tests on layers and processing for a rolling glass object showed that a traditional vehicle approach of pitch ramping through a blend of layers was not going to work. From recording and analysing a bunch of glass things rolling and spinning around, I realised that the main “sound of rolling” is defined by a sine sweep that describes a full rotation, and this should slow down and speed up based on roll speed. My first attempt of chopping up and recombining individual rotations was fruitless, so I settled on the approach of using an LFO in Wwise to create this shape dynamically in a designed piece of noise.
As you can see in the video, I set up a parametric EQ on the mix busses for rolling sounds, (in-picture left) then used a rolling speed parameter to control the Attack, Depth of Frequency of an LFO (in-picture right) to apply the “sound of rolling” to the noise layers.
A couple of notes beyond what’s shown here:
• I’ve isolated just the rolling in the video, there are water layers and fish movement layers present too in-game. However, I kept the bowl impacts as they do a crucial job of covering some janky frames when the ball goes from very fast to stopped and also registers the ground.
• We do a check to see if the vehicle is grounded as there are plenty of airborne moments and this is a surface layer.
• You can hear it only faintly in this video example, but at high speeds a glassy texture is added as an alarm to let the player know they have reached a speed which will cause the bowl to smash if they don’t lose momentum.
Ice Cube Vehicle
I wanted to quickly share one thing about the ice-cube vehicle too, shown in the video. Mostly it was fairly straightforward to use this vehicle’s momentum to drive RTPCs, however I was struggling with the impacts; and they are the key layer for gameplay feel. I solved this by using angle of impact for the first time; so there are two types of designed impacts - scrapes (when the angle of impact is between 10-60 degrees) and hits (when the angle is 60-90 degrees), which are selected using Switch Groups. This seemed very obvious once I’d found the solution but took me a while to recognise.
I could trickle on at length about how we made the water sound splash off the screen… But I’ll just pick a couple of things.
Surfaces and edges
As those who have attempted it before know, water is a little bit tricky for object-based audio and the use of a spline system to move the sound source relative to the player is required. I focused on two uses of this to try and get good coverage for water audio. First was getting our graphics programmer to define a “surface boundary” for each body of water, shown with the red line. Secondly I also defined “traversable edge” regions (shown in yellow), for edge areas that were important to gameplay, usually because they were the player’s destination.
As you can hear in the following video, the surface spline is located directly below the camera to enable the sound to attenuation for camera height, but importantly it also stops when it reaches the red marked boundary, and waits there until the player returns; as our puffer friend has a real penchant for getting out of bounds!
Water, music and how not to make it all sound dull
From day one of this project I had a big question on my mind. How do I make this game not sound dull and flat when I’m underwater, when I know that the allegory for underwater is to roll off a bunch of high frequencies? The answer came to me from the music. The score of I Am Fish is intended to mirror the emotional state of the fish, especially as the game plays a lot with things that seem unthreatening on their face but are rather different when you’re a 10cm goldfish. Fish like being in water, so I had the idea to flip the dampening idea on it’s head. What if the music was dampened when the camera is out of water (in the human domain) and full spectrum when the camera goes back underwater to the fish’s happy place! This gave me the added benefit of creating room in the mix for ambience above water while covering the LPF effect when submerging. They always say; you know a design solution is good when it starts solving other problems too! We also extended this to maintain full frequency music if the player is above the water and also using their special ability (ie. flying/rolling/biting).
Fish Movement and Specials
Foley is always a treat to do, and that’s still true for fish! But get ready to unhook a lot of footstep concepts you’re used to! I’ll share a couple of things about how the sounds for the actual fish came together.
This was another example of expectation reversal. The default view that “as video game character moves faster, more foley audio is heard” turned out to be untrue for our fish. The important player feedback and correct feel was that activity was heard from the fish’s tail mostly during maneuvering; ie. changes of direction or speed, but while the fish is heading in a sustained direction then water pad layers (or wind if airborne) were better to convey speed. Frankly I didn’t have the first clue how I was going to do the movement sounds for these fish coming in so it was very rewarding to find a solution that felt right. In the end a simple loop of high pitched bubbling that was processed using pitch and filters did the heavy lifting, as shown in the video.
Adding personality to the fish
The fish are the stars of the show in our game. Here are a couple of highlight sounds.
The puffer fish’s special ability is to inflate, giving it the properties of a ball - rolling, bouncing etc. It reminded me of a semi-inflated foot[soccer]ball.
Here it is in action:
The piranha was, perhaps predictably, quite bitey. It reminded me of a small dog, so I scoured my library for snuffles, whines and gnawing and made a fun dynamic instrument. Having a dynamic loop helped out with a game design challenge too. When the piranha has successfully bitten a gameplay prop, the player must use the main input control to wiggle the prop free. With no sound this was confusing as the player could no longer move, but left-stick wiggle = more growly-barking exertion sounds seemed to get the message across well.
Thanks to Audiokinetic and Bossa for asking me to put this together. I hope you were able to take something useful away from it. I hope you all enjoy a well earned rest this coming holiday season!