This template is designed to provide a flexible and easy-to-customize foundation for wave-based shooter games. Built with scalability in mind, it includes parent classes for players, enemies, projectiles, items, and spawners—allowing developers to expand and modify mechanics with ease. A demo level showcases its features in action, making it an ideal starting point for both beginners and experienced developers looking for a solid base.
Flexibility is a core focus of this project, ensuring that users can easily tailor the template to fit their unique game ideas. To achieve this, I applied user-centered design principles from the start. I conducted research by distributing questionnaires to novice developers, gathering insights into their familiarity with key features and their needs when working with game templates.
This feedback directly influenced the design, helping me prioritize intuitive workflows and modular systems while keeping the template open for future expansion. By integrating user input early on, I ensured that the template not only simplifies development but also empowers users to customise and extend it to match their vision.
Below are a few examples of the questions asked during the research phase.
Based on questionnaire data, I adopted a parent/child blueprint approach, as most developers were comfortable with it. This inheritance-driven design streamlines workflow and enables quick feature expansion by modifying a single class, making development more efficient and scalable.
When implementing the damage system, I initially tried using "Get Distance To" to allow developers to customize attack ranges for both melee and ranged attacks. However, I found this method, along with line traces, could be too complex for some users. To simplify implementation while maintaining flexibility, I chose to place sphere collisions around the player to define attack range.
This approach makes it easy for developers to adjust the radius and even enable in-game visibility for playtesting. The system operates on a timer, running every 0.1 seconds to check for overlapping actors. If an enemy is detected, the damage process is triggered. While this method relies on frequent collision checks, it offers an intuitive and efficient way to manage attack detection. Below is a breakdown of the set timer by event that handles the collision check.
Using the parent enemy class, I created a structure that serves as the foundation for a data table. This structure includes a map variable linking enemy class types to an integer value, determining the number of each enemy per wave.
By using a parent class, all child enemies automatically appear as options in the data table, allowing developers to easily set up waves and customize enemy types and counts. This approach streamlines wave creation while maintaining flexibility and scalability.
To help prevent errors, I implemented built-in debug features that display UI messages guiding developers through setup. For example, if waves aren’t set in the data table, a reminder pops up to check this step.
Since setting up multiple features can be overwhelming, this system helps developers keep track of essential tasks. I also created a reusable debug function with an input for custom messages, making it easy to add new debug prompts as needed.