Re:Fresh 

A 3D Open Zone "Solarpunk" Platformer

Play it HERE on Steam now!

Re:Fresh Launch Trailer

Pre Production

The first few weeks were spent brainstorming and elaborating on ideas for our final project. We utilized Miro, Trello and Github in the beginning stages to establish a structure for the development to come. With a mix of online and in-person, we were able to whiteboard a lot of our initial ideas and expand upon them with group discussions and rough sketches.


Most of the pre-production period was spent integrating Wwise into the Unity project, solidifying my pipeline for creation to implementation of sounds, and establishing a tonal identity for what Re:Fresh would be. 

A link to our production bible can be found HERE

Production

Production of Re:Fresh was broken into 2 stages, based on the semesters that we worked on it at school. The first stage was the fall 2022 semester where we created a prototype for Re:Fresh that we launched on Itch, as well as a majority of our brainstorming and modular foundation work. The goal for our prototype was to create systems that we could scale to handle more content because we knew we had another 4 months of development time in the spring 2023 semester. 

For the prototype development my efforts were focused on creating the core feedback and environment sounds so players could get immersed into the experience of Re:Fresh. This functionally included player character sounds, interaction and UI, and dialogue. 

Our second stretch of development in spring 2023 was focused on adding new content through the modular systems we created, fleshing out the world of Re:Fresh, and polishing everything to get it ready for release on Steam at the end of April. Another major component to our second stretch of development was creating a showcasable build that we could bring to GDC 2023 to demo at GDC Play! 

The main things I focused on in this second stretch of development was working with composers to create a score for Re:Fresh that would evolve as the player progressed through the game, flesh out the environment, and create a system for dynamic footsteps. 

Now let's take a closer look to some of the work that was done! 

Dialogue System:

The first major system I designed in the first stretch of the project was the dialogue system. With the scope constraints of a school project, lots of interactable characters and dialogue, I decided that having bespoke voice acting was way outside of reasonable scope for us to achieve. Talking it over with my teammates, we decided that a style similar to an Animal Crossing dialogue system would be a great fit for the style of game we were creating. I looked into how other designers had achieved similar results and found THIS tutorial by Blipsounds (who I later found out are Austin Local!) and modeled our dialogue system after this. 

From this I went to a recording studio and had the development team record themselves going through the alphabet, pulled all the recordings into Ableton, time stretched it (not accounting for pitch), and created a Wwise event for every single letter for every voice actor. 

I worked with our Narrative Designer, who was working in YarnSpinner, to pass every letter that is written on screen in dialogue to me. I then wrote a script where a voice actor can be assigned to an NPC, and the written character is also passed to that script, so Wwise could dynamically post dialogue events as the letters were typed on screen!

Dynamic Footstep System:

Another major system I developed was how footsteps would be dynamically reactive to what surface the player was walking on. When we initially released the demo of Re:Fresh the only footstep sounds implemented in the game were the sounds of walking on grass. I had initially setup the implementation of footsteps through a script that called the Wwise events and hooked it up with Unity Animation events to match the sounds to the heel-toe movement of the player character. For an initial implementation it did exactly everything it needed to! However, when it came time to implement the other types of footsteps (there's a bit more than just grass in Re:Fresh) I quickly realized there was a lot more work that needed to be done. 

One of the first major obstacles I encountered was the fact that we had used Unity's native terrain system to sculpt the world for Re:Fresh. While it was super useful for us to quickly iterate and carve out the environment, when I started looking for tutorials on how to do a dynamic footstep system I wasn't able to find any tutorials for Unity terrain and Wwise. In fact, there were barely any tutorials online for dynamic footstep systems in Unity in general! However I did find a 2 tutorials that I was able to take parts of each of them to create my own system that worked for Re:Fresh. 

The first tutorial I found was THIS tutorial by Michael G Wagner of Drexel University. This tutorial was the one that made me realize the problem I was in with Re:Fresh having used Unity terrain. I knew that the idea of checking all the objects the player ran over would be necessary for the placed objects in the world, but it didn't solve my issue for when the player was walking on just the terrain. We had stone, sand, mud, and grass terrain...so how do I solve for all of those different types of materials when it's all just painted terrain? 

The next tutorial I found that helped bring all of this together was THIS tutorial by Natty GameDev. It used a raycast to ping to the terrain underneath the player, and combined that with another script that could determine the weight values of the painted terrain to return what painted terrain the player was standing on. 

I created scriptable objects for every type of footstep in my switch group in Wwise, and assigned those switches to the scriptable objects. I then combined both tutorials so that when the player was on terrain OR an object the raycast could tell the footstep swapper script to trigger a scriptable object that would then change the switch in Wwise to the corect footstep group. After testing and getting the implementation working correctly, I put the raycast checker on the animation event timeline so the raycast pings only a few frames before foot contact so it's not firing in update and eating into compute resources. 



Here is a quick video breaking showing the process created above with some visual representations

Postmortem

I learned so much during the development of this game. Going into the project, I'd worked on only a handful of games, and none of them to the same scope as this project. I learned how I liked to work, what parts of development I enjoy vs parts that are stressful and difficult for myself, and how to work hand in hand with other disciplines to work towards a more cohesive goal. I found out that I personally really enjoy the technical side of audio design/implementation, and struggle a lot with the more creative sound design aspects. However learning this about myself motivated myself to want to become a better sound designer and more rounded developer. This was one of most enjoyable projects I've had the pleasure to work on, and a huge shoutout to the rest of Merge Conflict (Connor, Karina, Jospeh, Ethan, and Melody) for allowing me the opportunity to work on Re:Fresh.