

What is Quackaneers?
My bachelor’s project Quackaneers is a multiplayer PC game made in Unity, where two teams of players try to accumulate the largest pile of treasure within a given time. The team with the most treasures wins the game.
The players control pirate ducks, who can use their beaks as cannons to defeat opponents and steal their treasures. Defeated opponents are temporarily sent to prison.
The atmosphere is colorful, humorous, and cartoonish, aiming to create a cheerful mood.
Project Goals
Given the tight time constraint of 16 weeks, it was clear that I was not going to be able to finalize the entire game. Therefore, the goal was to create a cohesive game package, which includes building gameplay mechanics, editor tools and the game world. I streamlined these processes to allow for efficient implementation of future additions such as additional items, cosmetics and islands.
Every single asset, texture, or shader you see was made by me, including the theme song. A few assets had been prepared in the previous semester.
Tools
Spawn Point Object Preview
Problem: The islands’ vegetation and treasures will be spawned randomly at the beginning. It got tedious to move around invisible spawn points when working on an island and it would be nice to test the randomization on demand without starting the game first.
Solution: I created a custom inspector with buttons, which let me randomize and delete a preview. The preview is automatically generated upon opening Prefab mode and deleted when going back to editing the scene.
Global material property editor
Problem: Lots of shaders need access to the same information or use the same settings for certain properties. Setting a bunch of properties in multiple materials for every tiny change was bothersome and inefficient.
Solution: I created a custom inspector, in which each of these properties can be edited and set for each affected material in real time.
At first I wanted to cycle through materials, which is why you can still see them listed, however, I ended up setting global variables instead.
Customization
To make the game more fun I implemented a customizer which lets you pick between a few different hats and an optional eyepatch. This system could easily be expanded upon.
The hats and eyepatch are named by their categories’ prefix and stored in a list of their respective categories, so items of different collections can be combined. The index of each category’s selected item is saved so it is correctly loaded when restarting the game.ย
Working with a costume’s index instead of GameObjects also helped in the networking aspect, because GameObjects can only be sent under certain conditions. Sending the number of an item on a list which every player has on their system already is an efficient workaround.ย
Problem: A discrepancy between the hat’s position and the ducks head’s position occured, when the duck was swimming, since the hat was parented under the head bone and copying its position from the bone’s physical, undisplaced location.

Solution: Exporting the hats with the duck’s skeleton and some weight paint, so it uses Unity’s Skinned Mesh Renderer Component and has its vertices follow the animated bones just like the duck does.
To avoid a bloated hierarchy, I had a script exchange the Skinned Mesh Renderer’s Bones for those of the duck, copied their bounds and deleted the bones that came with the hat.
Animation

The Walking Duck – when NavMesh Agent is moving, collision layer is “land” and grounded check is true

Swim – when NavMesh Agent is moving and collision layer is “water”

Fly – When exiting a collider (Land/Water) and not grounded. Also: When using the “Wings”-Item.

Attack – Avatar Mask + own layer in Animator makes it usable no matter the current animation. An Animation Event shoots projectiles only whenever the beak is open. This way projectiles can not be spammed.

Idle – Is looping with a Fixed Exit Time. Afterwards a random clip from an Idle Blend Tree will be played. If the same clip played last time, it will choose a different one.

Blinking – Blender’s Shape Keys can be read by Unity in any exported animation clips, if they are animated using a Driver.

Random Idle 1

Random Idle 2

Random Idle 3