Bounce Shooter
Bounce Shooter is a custom game I made by myself in Unreal Engine 4 over the course of 18 weeks. It is a third-person shooter where the player is armed with a bouncing projectile and must use it to defeat enemies and solve puzzles. My goal for this project was to create a deep gameplay experience using a simple mechanic and utilizing it in multiple ways. As the sole designer, I designed the gameplay mechanics, created all of the art assets, scripted all game systems, and constructed the world.
Project Details
Postition: | Sole Designer |
Engine: | Unreal Engine 4 |
Development: |
18 weeks |
Genre: |
Third-Person Puzzle Solver |
Jump to:
Design Goals
Deep Gameplay
For this project, I wanted to create a deep gameplay experience using only a single game mechanic, a bouncing ball projectile. I created a wide variety of different game systems, such as buttons, gates, and enemies, to challenge the player with. As the player progressed through the game, I would force them to utilize the projectile in a new way by providng more complicated puzzles or combat encounters.
Careful, Methodical Shooting
I wanted to make sure players were being careful and methodical when firing the projectile. I did not want them to be blindy firing shots all over the place and getting lucky. To ensure this, I implemented two things: a stamina system and grid-like art assets.
Every time the player fires, it uses up stamina. If the player runs out of stamina, they can’t shoot again until it refills. This forces the player to be careful with their shots. The grid-like pattern that covers the world helps you judge where to place shots more easily, allowing for more methodical gameplay.
Scripting
Bouncing Projectile
The bouncing projectile is used to interact with world objects and fight enemies. It is a Physics Object that can bounce off any surface. It will always destroy itself on its third bounce or when it hits an enemy.
Pressing the left mouse button instantly fires a projectile. Holding down the right button begins charging up the shot instead, draining stamina as you do. The longer you hold down the button, the faster the projectile fires. Holding the right mouse button also brings up the aim line GUI.
Drawing the Aim Line: To draw the aim line, I used UE4’s built-in “Predict Projectile by Trace Channel” function to output an array of vectors that traced the projectiles flight path. Then, I spawned the glowing dots at these positions. Originally, the aim line also showed the path of the projectile’s ricochets. However, I removed this functionality when I discovered it was actually more fun not knowing exactly where the projectile would end up after you shot it.
Stamina System
The player uses stamina whenever he sprints, charges up a shot, or fires the projectile. If the player ever runs out of stamina, he will not be able to perform any of these actions until his stamina is full again. By using stamina as a shared resource for everything, players are forced to be more deliberate with their actions.
I wrote my own state machine in the Player Character Blueprint to handle all stamina interactions. The player’s stamina state is determined every frame based on the player’s inputs and current stamina level.
Enemy AI
The enemy AI, called Cubes, will stay idle until the player engages them in combat. When the player kills any Cube, all nearby Cubes immediately become aggressive. While in combat, Cubes will try to reach the player and perform a melee attack. If the Cubes cannot reach the player, they will simply move randomly until they can.
I used a combination of Behavior Trees and Blueprint to implement the enemy AI behavior. Additionally, I employed an Environmental Query System (EQS) to make the Cube’s movement more advanced. If given more time, I would have liked to also try using flocking algorithms and Boid’s to make the AI move as a group.
Using EQS: In previous projects, I had issues with the AI moving too linearly towards the player. This made AI seem robotic and unintelligent. For this project, I employed EQS to make the enemy AI move towards positions on the player’s flanks (instead of the player’s exact position). This allowed the enemy AI to move in a zig-zag pattern, making them harder to hit and more fun.
Wall Buttons & Gates
Wall Buttons are a simple switches that activates when the player hits it with the projectile. Once activated, Wall Buttons will always stay on. Since there are multiple variants of Buttons in my game, I created a Button parent class.
Gates work like typical video game gates. They remain closed until the player hits all necessary switches to unlock it. To control the connection between gates and switches, I also created a GateController actor.
Consecutive Buttons
Consecutive Buttons are a variant of Wall Buttons that require the player to hit multiple buttons in a certain order quickly. When the player successfully hits all buttons in time, they stay on permanently.
After hitting the first Consecutive Button, the next button in the order will become active. The player will have a few seconds to hit the next button. This continues until all buttons are pressed. If the player takes too long, all buttons reset to their original states.
Postmortem
What went well...
- Modular world geometry pieces allowed for quick construction and rapid iteration of level
- Creating all level mechanics (pressure pads, locked doors, etc.) early in development allowed me to create many different variations of puzzles to determine what worked
- Constant refactoring of code allowed me to create versatile blueprints that can be used in multiple ways
- Being responsible for all aspects of design allowed me to better understand how each system depended on each other
What went wrong...
- Some mechanics, such as aiming down and jumping, were not utilized for puzzles as much
- Last minute changes to gameplay systems caused system-wide issues and that took many hours to debug
- Some conveyance issues with some of the puzzles, especially when players are introduced to a brand new mechanic
- Difficulty curve is pretty high, even for seasoned gamers
Even better if...
- Included more puzzles that taught and reinforced that powered up shot mechanic
- Created a greater variety of puzzles that combined multiple level mechanics
- Added in more behavior, such as Boyd’s and flocking algorithms, to the enemy AI to make them less predictable