Made with:
Unity (C#)
Unworthy (2023)
Introduction
This project was an effort to get out of the 'project hopping' habit, to get something that was actually playable, and receive feedback. I also started making devlogs on YouTube starting with this project (Devlog YouTube playlist here ). This forced me to have a demo to show every two weeks until my set deadline.
I learned a lot from developing 'Unworthy', from how to plan a project to how to actually build and ship a game. The biggest lesson I learned though was the importance of planning and implementing saving features early. I'd never needed to send state between multiple scenes, but had lots of trouble with this the week before the game was supposed to be published on 'Itch.io'.
Notable Problems Solved
- Ocean System and shader (floating points)
- Dialogue system (using 'ink' by 'inkle')
- Top down map rendering (render texture)
- Deciding which fish the player would catch (terrain painting)
Ocean System and shader (floating points)
Note: Although the buoyancy system logic here is consistent with the final product (with minor modifications due to scaling), this is an early version of the shader which later had to be simplified for scaling purposes.
This was originally a final project for my introduction to computer graphics class. I created an ocean mesh that floated objects on top of it, as well a simple ocean shader using Unity's shader graph.
The objects that are buoyant have a 'WaterFloat' script attached to them as well as 4 'float points' positioned at the corners of the floating object. After getting the height of the water line and whether majority of the float points are under the water line, a force and a rotation would be applied to keep the object afloat.
Dialogue system (using 'ink' by 'inkle')
You can see the player letting the dialogue finish, skipping to the end of dialogue, and skipping entire sections of dialogue in the above video.
Using the narrative scripting language 'ink', I was able to create dialogue with multiple choices that the player could choose from.
This system made the entire dialogue process highly modular. It removed limitations on the number of choices available to the player, allowed flexibility in the order of dialogue between NPCs and the player (not strictly alternating lines), facilitated displaying the current speaker's name above the dialogue box, and provided options for players to skip lines of dialogue or cancel letter animations.
Top down map rendering (render texture)

Example of a map rendered with fish areas highlighted in red.
For this game I wanted to have a map location to show the player where to find fish. I didn't want to have to draw out my own map as I wasn't sure if I would be making updates to the terrain. So I needed something that I could update relatively quickly and easily.
To do this, I used the functionality of render textures in Unity. I placed an orthographic camera in the scene pointed at the terrain from a bird's eye view, and placed a render texture on this camera. I then wrote a 'MapGenerator' script that rendered the scene that the camera was capturing to the render texture, captured the render texture into a Texture2D object, and then saved the texture into my project. This then allowed me to place the texture in the player's book, helping them to locate the fish they are tasked with catching.
Deciding which fish the player would catch (terrain painting)
Texture can be changed on the fly, and then associated to a specific fish type in a ScriptableObject.
One of the big inspirations for this game is 'Dredge' made by Black Salt Games. In Dredge, the player is able to fish only at select fishing spots.
I wasn't a huge fan of that system, so in 'Unworthy', I made it so the player can fish anywhere in the water. This led to a new problem to solve: how do I decide which fish can be caught in which areas? I solved this problem with terrain painting.
The 'island' in the game underneath the game's sea is created using Unity's terrain system. This system allows you to paint textures on your terrain. So for the fishing system, I made a ScriptableObject for the fish type or fish types that would prevalent in that area. I then shot a raycast down from the player's boat whenever the player indicates that they are fishing (F on the keyboard), which allowed me to know the exact texture they were fishing over, and therefore which fish type(s) they could catch.