top of page
  • Group 2
  • Group 3

Trigger Happy (2025)

Project info

Role: 

Technical & System Designer / Project Owner / Lead Designer

Engine:

Unreal Engine

Teamsize:

10

Duration:

4 Weeks

Genre:

FPS

Platform:

PC 

About

You play as Happy, a Reaper, an enforcer in a world ruled by ruthless megacorporation's. When a company fails, it’s your job to liquidate everything: assets, personnel, and the building itself. Your next assignment takes you to a massive, bankrupt megatower and nothing inside wants to go quietly.

2025-10-17 12-17-05.00_01_45_44.Still002.png

Introduction

This game was created during a four-week project at Futuregames. We were given three songs to choose from, and we decided to go for something fun and different by picking “Happy” by Pharrell Williams. In our version, Happy is a gun-loving teenage girl whose best friend is her gun, “Sunshine.” This idea let us go a little wild with the design and really lean into the crazy, over-the-top vibe we wanted for the game.

Elevator System

The elevator system was one of the features I spent the most time developing, alongside level management. Initially, I tried moving the elevator between positions, but collisions became an issue since levels weren’t aligned vertically. After some debugging, I switched to teleporting the player between elevators instead, which worked much better.

I created an Elevator Data Handler blueprint with two elevators; one for entering and one for exiting a level and ensured levels loaded and unloaded correctly. This system was used by the level designer to be able to create their levels without any restrictions on sizing, rotation or location. 

 

Code Snippets

Elevator System

Level Management

I created a Level Manager that handles all logic for loading and unloading levels. When the player enters the elevator, it selects a random level to load.

To make testing and progression setup easier, I added the option to define an array of levels that the system goes through in order. Once that list is empty, it switches to selecting random levels. This made it simple to test specific levels or start the player in a particular sequence.

I also implemented event dispatchers in the Level Manager to manage timing for UI updates and connections with other systems. The setup worked well overall, though it could use some refactoring since a few dispatchers currently serve similar purposes due to time constraints.

Code Snippets

Level Manager

UI

UI was one of my main focuses during the project.

 

I managed it through a UI Controller Component attached to the player, which references the HUD containing all UI update functions. The UI Controller binds to various event dispatchers for updating elements like health, shield, killstreak, recharge, floor info, and enemy count.

These dispatchers receive the necessary data (e.g., current kills, total enemies) and are triggered across different systems. The setup worked smoothly overall but it would also need some refactor together with the event dispatcher on the level manager. 

The settings system saves and loads audio, graphics, and control preferences. I ran into an issue where setting music volume to 0 stopped it from playing again. The fix was enabling Unreal’s option to keep audio active even at 0 volume.

Code Snippets

UI Controller

Highscore Save & Load

Handling high score saving and loading required careful setup. I created a player actor component that saves the score on death and adds it to an array in the save system, which loads at the start of a game.

 

To prevent the array from growing indefinitely, I implemented a system that keeps only the top scores copying, trimming, and updating the array safely. This approach now works reliably and allows setting a maximum number of high scores to store.

Code Snippets

Highscore

Player Abilities

I worked on several player abilities: shuriken, flamethrower, shield, and grenade launcher. The shuriken travels in a straight line, hitting all enemies in its path. The flamethrower deals damage over time, while the shield acts as an extra health bar that regenerates after 3 seconds. The grenade launcher throws grenades that explode on impact, dealing heavy area damage.

The systems worked smoothly overall. The only minor issue was showing the grenade on the weapon before throwing it. Using the actual grenade mesh made it appear too large near the camera, so I added a scaled static mesh on the gun as a visual placeholder. The thrown grenade then uses this position to stay hidden, which worked well.

Grenade

Shuriken

Code Snippets

Grenade 

Shuriken

12.png

Product Owner

I served as Product Owner and Lead Designer for this project, focusing on keeping the scope manageable and ensuring the game remained cohesive. While the team generally aligned well with our core pillars and intended game feel, I occasionally had to step in to prevent scope creep.

Some “nice-to-have” features were paused or deprioritized when more important tasks required attention. I made these decisions transparently, and the team was understanding, knowing these features could be revisited later. I also guided discussions to keep the team focused on the main game and avoid overly complex systems that couldn’t be implemented in time.

Tools

I created several tools for this project to help the level designers.

One tool allows designers to rotate, move, and scale objects individually using each object’s own pivot rather than a combined pivot.

The screenshot tool lets designers add multiple cameras to a scene, take screenshots from each, and save them locally. I also added a button to delete all cameras at once. Ideally, I would have used Unreal’s bookmarks for this, but they were only accessible via the source code API, which wasn’t available.

Additionally, I built a renaming tool that automatically prefixes files in the outliner based on type for example, textures get T_ and static meshes get SM_.

Code Snippets

Tools

2025-10-17 12-17-05.00_03_16_50.Still007.png

What I learned

This project taught me a lot about keeping code and projects clean. I gained a clear understanding of which parts of the code could be refactored and which areas are not optimally organized. Due to time constraints, I wasn’t able to implement all improvements, but it’s something I plan to address in the future.

The team dynamic was excellent, with a strong focus on transparency, which I believe improved our overall work. After the project, we held a retrospective to discuss what could have been done better and how to improve communication and understanding of each team member’s workload.

© 2025 by Isabelle Höljer Heiskanen

bottom of page