Project Mana is a open-world, Unreal Engine, C++ project developed primarily by me. In the future, I look forward to collaborating with programmers, audio designers, and anyone else interested so that it may become a more complete project. Project Mana combines unique hook-shot-wall-run based traversal mechanics, RPG resource management and item systems, and a large open-world level.The traversal mechanics include: a wall run that allows you to navigate along on any vertical surface, a hook shot with three unique hooks: a pendulum swing hook, a zip-to-point hook, and a launch-up hook. All of these systems combine with smooth mantling to ensure the player can reach anywhere they see in the world. These movement mechanics create an expressive character that can explore every nook and cranny of the level.There are two primary RPG systems in Project Mana: Health, mana, and stamina resource management, and an extendable item system that allows players and enemies to reuse the same items. These resource-heavy systems make the player think, plan ahead, and quickly react to the environment while they are exploring the large, open level.Project Mana includes an open-world level with 3 Points of Interest that can be navigated to in any order. I had two key goals I kept in mind for the core player experience. I wanted the level to give the player a sense of wonder and volition through a large, exploration-heavy map, and I wanted to teach the core mechanics of the game through the environment.Project Mana is something I undertook to push myself as a Game Developer and Designer. Through Project Mana, I got to practice some of my favorite things, from Level Design and character controllers with animation, to Technical Design and 3Cs design. I also got to practice some new skills such as C++ and Unreal's Gameplay Ability System.
Click the Images Below to see more
For this project, I decided to use C++ and Unreal Engine to develop the open world. I decided to use C++ to boost my skills as a software engineer, support performance of a large open world project, and expose functionalities that only C++ can grant me. Unreal Engine also comes with a crucial tool called the Gameplay Ability System (GAS) that is only accessible in parts through C++. This system gives all actors an ability component which can dynamically grant and remove abilities to the player. These abilities can be anything as small as equipping an item to as big as an entire hook latch. I used GAS to organize and control what abilities the player and enemies could activate and when.
Using the Gameplay Ability System
One of the primary benefits of the ability system was that abilities can naturally block other abilities. For instance, I used this to ensure that when the player is currently performing a dodge roll, they are blocked from activating an attack. However, the inverse is not true. The player can perform a dodge roll when they are attacking. This let attacks be cancelable which was one of my primary goals to ensure the player felt free. The gameplay ability system gave me the freedom to set how abilities talk to each other in a clean and organized matter. This allowed me to detail the gameplay abilities and improve the overall feeling of the game.Gameplay abilities also let me control when abilities could be activated based on the player's current stats. For instance, if the player doesn’t have enough Mana to perform a wall run, then the ability simply won’t activate. The same logic applied for stamina and dodge rolls. It also let me control how much of each stat each ability drained. This provided a flexible and organized system for me to add ability drains that could scale with the game as it grew. I wouldn’t have to worry about checking for Mana or Stamina in each and every ability since every gameplay ability automatically had a checking system in place.I used GAS to share abilities between enemies and players if the behavior was largely the same. For instance, both enemies and players can grab items found in the world, so they are competing for the same resource. Players and enemies essentially needed the exact same ability applied to them to pick up an item. Thanks to the way abilities were organized, I was easily able to grant both of them the same ability, and the functionality simply worked between both classes. If players and enemies needed fundamentally different abilities (for instance, enemies can’t wall run) then I could simply not apply the same ability or write a completely new one to match the expected behavior. Essentially, GAS allowed me to have a component like structure for any action players, enemies, or NPCs could take. This sort of flexibility allowed me to easily add abilities in my game without worries about scope-creep or organization. Since abilities could easily block each other through a tag-based system, I never had to worry about competing abilities interfering with each other.
Using C++ with Unreal Engine
C++ allowed me to organize my class structure and inheritance in a way that was easy for me to understand and work with. For example, I added an item class that multiple objects inherited from in an easy to use manner. The item class simply came with a mesh and a collidable sphere object that had an override for what to do when an item was overlapped by a character. This was the backbone for mana pick-ups and my equipment system since they both needed a sphere collision and a mesh. I could then easily override the collision script for each system to apply the appropriate behavior. While systems like this are possible in blueprinting, it’s hard to keep organized and flow from one script to the next. In C++, I found it much easier to control, override, and edit the scripts to apply what I needed.