About
It is an environmental puzzle game.
The main character is a small flying drone with the ability to take control of other robots encountered along its path, using them to overcome environmental puzzles that block its way.
We created a demo consisting of 4 levels (the first one is a tutorial) with a duration of about 40-60 minutes (depending on how much the player explores, as there are hidden optional puzzles in the levels).
You can find the last version of the game at the bottom of this page.
Project Info
![]() |
Team Size: 14 |
![]() |
Time Frame: 6 Months |
![]() |
Engine: Unreal Engine 5 |
![]() |
Platform: Windows |
What Is Gamelab?
GameLabs are collaborative workshops where students from all disciplines—Game Design, Game Programming, 3D Art, and 2D Art—form teams to create a game from scratch (create a remake of an existing game for first-year students).
These teams are given a set development time to complete and deliver a final product, including a pitch for a hypothetical publisher, simulating a real-world work environment.
Students are expected to self-organize and collaborate effectively to bring the game to completion.
The only "rule" is that they must use development management tools (such as Trello or Jira) to track and organize the entire creative process, and apply Git version control with proper GitFlow practices.
Main Personal Contribute
In our team, there were two programmers, and we divided the various systems equally. The main systems I worked on include:
- Multiple controllable character system: the system that manages the core game mechanic, allowing players to control multiple characters through an inheritance-based structure.
- Health System: A generic character health management system and the relative UI.
- Throwing System: Component gives the player the ability to aim and throw equipped items.
- Chaos Implementation: Setted up unreal engine’s chaos system for every destructible object of the game.
- Highlighting System: A system for highlighting all interactables objects of the game when the player is close to them.
- Chest System: A chest system with fixed drops, for collecting in-game items. And the relative UI when collecting new items.
- Items: All the items that give the player offensive and defensive abilities.
UE5 and Blueprints
This was my first project in Unreal Engine, and consequently, my first time working with Blueprints.
After six months of using them, I’ve come to the conclusion that they are an extremely powerful tool, especially during the initial prototyping phase.
However, to achieve a clean, organized, and—most importantly—easily maintainable result over time, it’s essential to complement them with good old C++.
As projects grow in complexity, there's a serious risk of getting lost in a tangled mess of nodes that becomes increasingly difficult to manage.
The class shown below is the base class from which all controllable characters (including the little main drone) inherit.
- Unreal Events
Begin Play: Just a basic initialization of the pawn, caching some external references.
- Movement
Input actions from Unreal Enhanced Input System for translation and rotation input. - Interactable Detection
Begin/end ovelap component events for the detection of all interactables (interface) nears the player. Basically a simple sphere collider. - Damage
Default Unreal's event for damage applying - Custom Events
- TryPossessNewEntity: event for trying to control a new robot. empty because each character needs specific implementation.
- PossessNewEntity: Event for the actual transition to controlling a new robot, in Unreal terms, assigning a new pawn to the player controller.
- PossessionStarted: Called on every robots when the player start to controlling them.
- PossessionEnded: Called on every robots when the player stop to controlling them.
- Respawn: Event used for respawning a robot.
- Health Manager Events
Callbacks from the custom actor component Health Manager, primarily used to trigger VFX associated with various events (damage, regeneration, etc.). The actual health management is handled within the component's Blueprint.