Skip to content

Arcade Space Shooter

Photo by Carl Raw on Unsplash

Project Details
Date: July 2025
Engine: Unreal 5.6.0

Arcade Space Shooter Experience

The focus of this project was to learn more about blueprint communication and create a player facing UI that updates as the player interacts with the game. I started with creating a projectile for the player to shoot that would destroy the asteroids. This was a fairly easy task as I made add a sphere to the blueprint and then proceeded to add a projectile movement component. Once that was correctly set up I added an enhanced input action called IA_Shoot and added an IsShooting boolean to turn the shooting on and off. I did a little more tweaking to complete the projectile blueprint and then started working on the next part of the project.

I set up the spawner for the asteroids with an integer variable called CurrentWave with a default value of one. I then implemented the interface BPI_RestartGame. From there I made a cast to the HUD so that I would know where to spawn the asteroids. From there I used a custom event called SpawnAsteroid with an input for location and for the type of asteroid it is (as there are different sizes of asteroids). I then used spawn actor from class to spawn the blueprint of the asteroid. I did some testing after that by setting up some temporary code to make the asteroids spawn on certain sides of the screen. After seeing it work and not discovering any bugs I removed the temporary code. When continuing in my project I started to work on the wave structure by creating a custom event, SpawnWave. When this event is triggered it will use CurrentWave minus one as the last index, for a for loop that spawns an asteroid in a random location on the screen.

Next I worked on handling the collision between the projectiles and the asteroids by using event handle collision. I set the vector location of the collision to a variable called DeathLocation before destroying the actor. I did this by using the default scene root and get world location nodes to set the DeathLocation before using the destroy actor node. I then added a sequence node and took the execution wire from 1 and checked to see if all the asteroids were gone. If they were I spawned a new wave of asteroids for the player to destroy.

From there I created the logic for the asteroids to break into smaller ones if they were medium or large. I did this by checking the current size of the asteroid and then I added a for loop to spawn the new asteroids at the DeathLocation. I then went back and added code to the asteroid blueprint to tell the spawner to break apart the asteroid.

For the next part of the project, I started working heavily on the pause menu and the UI implementation so the player would know what wave they were on, their score, and their life count. I added the pause menu using a widget blueprint, a boolean variable called IsPaused, and a custom event in the game mode, PauseGame. I also changed the ‘Trigger when Paused” to true so that when you press backspace it pauses and un-pauses the game. I finished the pause menu and made sure the menu would show and hide as the player interacts with the backspace before continuing on with the UI.

I finished connecting the appropriate nodes and blueprints so that the overall UI for the score, lives, and waves were connected appropriately. This was fairly easy to set up as these were things that were recently taught in the class. I was then challenged to find something more that I would like to add to the project and implement. I quickly decided I wanted to add a high score element to the game so that players felt more challenged and wanted to beat the highest score. To implement this I added more code to a new blueprint that contained the high score. This would keep track of the highest score in a variable and only replace the number if someone achieved a higher score. I then made the high score a part of the UI HUD, on the bottom of the screen in the middle, ensuring the player would see it while playing the game. This allows for the player to compare the score to their own while playing against each wave.

The last thing I worked on was getting some friends and family to playtest it for me and see what they thought. I got some feedback regarding the ship and how it was hard to tell which part of the triangle was the front. This was a quick fix as I talked with the testers about what would make it better, one mentioned adding wings to the sides. This is the idea I went with and implemented it simply by adding some cones to the side of the ship. If I were to continue this project today I would want to work on updating the high score, so it tracked the player who made it and the wave they were on. I would then work on implementing some enemy NPC ships for the later waves so that there was more of a challenge to the game.