
Ubisoft University Contest 2023
After School
Splitscreen third-person shooter made in 10 weeks for the Ubisoft contest. Released on Steam.



About
A splitscreen third-person shooter where you play as a kid with a water gun in a schoolyard. Built in 10 weeks for the 2023 Ubisoft university contest with a team of 8 and shipped on Steam.
The Ubisoft University Contest
The Ubisoft University Contest is a yearly competition where student teams from different universities across Canada develop a playable game prototype in 10 weeks. The theme and constraints are set by a jury of Ubisoft professionals, and at the end, every team demos their game at Ubisoft Montreal. Students and staff from the studio got to play our game directly.

For the 2023 edition, the imposed theme was "Arcade." The constraints were:
- An online leaderboard
- A creation/destruction mechanic
- A gravity-change mechanic
- Two concept arts
The leaderboard constraint is what led me to build the Flask REST API and the reusable HTTP/Leaderboard plugins. The arcade theme pushed us toward a fast, score-driven loop with the water gun and spider egg systems.
Character Customization System
Players can fully customize their character (gender, outfit, and gear) to become the most respected kid on the playground. In a splitscreen game where everyone shares the same screen, being able to tell your character apart matters. The system swaps meshes and materials at runtime based on the player's selections.
When a player kills a boss, they earn a coin. That coin goes into a claw machine to win new gear, a fun loop that ties progression to the arcade theme.
Data-Driven Cosmetics
All cosmetic items are defined in data tables with name, mesh, material, category, rarity, and drop rate. Designers can add new items or tweak drop rates without opening the codebase. The system reads from these tables at runtime to populate the shop and handle unlocks.

Each item has a drop rate that feeds into the unlock system. When a player earns a reward, the game rolls against the drop table to determine what they get. Rarer items have lower drop rates, giving players something to chase. The customization UI supports two players so each can pick their cosmetics independently.
Online Leaderboard & REST API
The online leaderboard is backed by a Python Flask REST API that I built and deployed. Players submit their scores at the end of a run, and the API stores them in a database. The leaderboard screen in-game fetches the top scores and displays them with player names and ranks.

Reusable HTTP Plugin
Making HTTP requests from inside Unreal isn't straightforward out of the box. I built a dedicated HTTP plugin that wraps UE5's HTTP module into a clean, reusable API. It handles request construction, response parsing, error handling, and retry logic.
The plugin became a building block. The leaderboard system is built on top of it, but it's generic enough to handle any REST API. I packaged it as a standalone plugin so it can be dropped into future projects.
Reusable Leaderboard Plugin
On top of the HTTP plugin, I built a dedicated leaderboard plugin that handles the full flow: score submission, leaderboard fetching, caching, and UI binding. It's designed to work with any backend that follows a simple REST contract. Swap the URL and you're good.

This layered approach (HTTP plugin into Leaderboard plugin) means each piece is independently reusable. The HTTP plugin works for any online feature, and the leaderboard plugin works with any HTTP backend.
And a Few More Things
Water Management
The water gun is the core weapon, similar to Mario Sunshine. Players refill at fountains and lakes. Different weapons consume water at different rates, adding strategy to weapon choice.
Spider Egg Spawning
At night, spider eggs spawn around the map. Ignore them and they hatch. The spawn rate escalates the longer they're left alone. Do you focus on the objective or deal with the eggs?
Playtesting Pipeline
Every two weeks, we ran playtesting sessions with students from another school. Having a structured cadence meant we always had fresh feedback to act on.