All posts

Blog · Systems design · Unreal Engine

Building a Modular Ability System

A scalable, data-driven ability framework in Unreal Engine built with C++ and Blueprints, and planned with the same structure I'd use in a studio.

UML diagram of the modular ability system classes

Introduction

As part of my ongoing technical design work, I've been building a modular ability system in Unreal Engine, combining C++ and Blueprints into a scalable, data-driven framework. It's both a practical tool for gameplay prototyping and an exercise in treating personal development with the same structure and planning I'd apply in a studio.

In this breakdown, I'll walk through the process from concept and system design to implementation and iteration.

Why build a modular ability system?

Simple attacks, healing spells, dashes, buffs: abilities are fundamental to countless genres. As a technical designer, I'm less interested in building individual abilities than in creating a system that lets designers define abilities easily, tweak parameters, and add new types without changing core code.

My design goals:

  • Data-drivenNew abilities come from data assets, not hardcoded logic.
  • ModularExecution logic is extensible without refactoring.
  • Designer-friendlyBlueprint-accessible and readable, even for non-programmers.
  • MaintainableFuture features like combos or upgrades integrate naturally.

Conceptualizing the system

The first challenge was scope. Rather than a complex RPG ability editor, I focused on a small, functional prototype that solved one clear problem:

"How can I let designers define new abilities without touching code, while keeping the system scalable for different effect types?"

I planned the system around:

  • Ability Data Assets as modular definitions
  • An Ability Component for executing effects and managing cooldowns
  • A simple UI widget for cooldown visualization
  • Event dispatchers so Blueprint designers can hook into ability execution

Before writing code, I mapped the structure with UML diagrams and rough data-flow sketches to clarify each class's responsibilities and plan for future extensibility.

System structure

At a high level, the system has three main pieces:

UAbilityDataAsset

A simple Unreal Data Asset that stores:

  • Ability name
  • Cooldown time
  • Effect type (Damage, Heal, Dash, etc.)
  • Effect value
  • FX and SFX references

UAbilityComponent

An Actor Component that:

  • Loads and manages abilities assigned in the editor
  • Handles input-based activation
  • Tracks and enforces cooldowns
  • Executes effects using data from Ability Data Assets

WBP_AbilityCooldownDisplay

A basic UI element that shows each ability's cooldown in real time, driven by event dispatchers from the Ability Component.

Separating data from execution draws a clear line between what an ability is and how it behaves.

Planning before coding

Before opening Unreal, I treated the project like a real development sprint:

  • Created Jira tasks and epics to manage priorities and time estimates
  • Wrote Confluence-style documentation for both designers and engineers
  • Defined stretch goals (combo chaining, upgrades) for future sprints
  • Focused early code on scalability and readability, not feature creep

This kept the implementation tightly scoped and avoided "prototype sprawl."