🎓 Bachelor's Thesis Solo project

GAS Prototype

A solo technical demo built in Unreal Engine 5, implementing a fully functional, modular Gameplay Ability System from scratch in C++.

Unreal Engine 5 C++ Blueprints GAS
Overview

What this project proves

GAS Prototype is a playable technical demo that demonstrates a correct, structured and scalable implementation of the Gameplay Ability System in Unreal Engine 5. The focus isn't a complete commercial game — it's a solid gameplay architecture where every system has a clear responsibility and communicates with the rest without direct dependencies.

The project proves that GAS, when correctly structured from C++, enables full reusability between different character types — both the player and the enemy share the exact same architectural base without duplicating any logic.

TypeBachelor's Thesis (TFG)
SchoolFlorida Universitària
TutorMiguel Fernández-Montañés
EngineUnreal Engine 5.6.1
IDEJetBrains Rider
TeamSolo
Architecture

Core C++ classes

The entire base architecture is built in C++, establishing a solid foundation that Blueprints extend without compromising its integrity.

AGameCharacterBase
Shared base for player and enemy. Initializes ASC, AttributeSet, and centralizes ability granting/revoking.
UExtendedAbilitySystemComponent
Custom ASC extension. Detects relevant ability set changes and notifies the character to update the UI.
UBasicAttributeSet
Centralizes all attributes (Health, Stamina, Shield) and the full damage pipeline via PostGameplayEffectExecute.
UMyPlayerGameplayAbility
Base class for all abilities. Configures shared tags, death blocking, UI visibility flag, and player/enemy detection.

Key architectural decisions

  • ASC on the Character — simplified setup appropriate for a single-player prototype without respawn requirements.
  • Single centralized AttributeSet — Health, MaxHealth, Stamina, MaxStamina, Shield, MaxShield and the Damage Meta Attribute all in one place.
  • Ability granting centralized in C++GrantAbilities and RemoveAbilities in AGameCharacterBase, returning handle arrays for precise revocation.
  • Hybrid C++ / Blueprint approach — structural logic in C++, ability behaviour and UI in Blueprints, following Epic's recommended workflow.
Abilities

Implemented abilities

Ability
Type
Key pattern
GA_Dash
Movement
CommitCost + Root Motion + GameplayCue
GA_MeleeAttack_AxeSwing
Melee
AnimNotify → WaitGameplayEvent + HitScan
GA_MeleeAttack_AxeCombo
Melee
3-level Blueprint inheritance + auto-combo for enemy
GA_ShootProjectile_Base
Ranged
Event + projectile spawn
GA_AOEAttack
Area
Bifurcated targeting + GameplayCue with parameters
GA_Defense_Shield
Defensive
AnimNotify → Event + GE with CurveTable
GA_EquipWeapon
System
Dynamic ability granting/revoking via WeaponsManagerComponent
GA_HitReaction
System
Activated by tag from damage pipeline
GA_Death
System
Activated when Health reaches zero
Deep dive

The damage pipeline

A complete centralized pipeline processes every hit before applying it to real attributes.

An ability builds a GameplayEffectSpec and assigns damage via SetByCallerMagnitude with tag Data.Damage.
The MMC (DamageGameplayModMagnitudeCalculation) intercepts the calculation — halves damage if the target has Status.Buff.Immunity.
PostGameplayEffectExecute in UBasicAttributeSet reads the Damage Meta Attribute, resets it immediately, and applies shield absorption logic before reducing Health.
A Gameplay Cue (GameplayCue.Damage.Burst) fires automatically from the GE asset — VFX and sound without any ability-side logic.
HitReaction activates automatically via tag if the GE has Effect.HitReaction and damage was greater than zero.
Death triggers automatically when Health reaches zero, applying GE_Death which adds the State.Death tag — blocking all abilities instantly.
UI

Reactive UI system

The UI never polls the system — it reacts to changes pushed by the ASC.

W_PlayerHUD
Root container and orchestrator.
W_PlayerVitals
Reactive Health and Stamina bars via WaitForAttributeChanged.
W_AbilityBar
Dynamically rebuilds ability slots when Event.Abilities.Changed fires.
W_Ability
Individual slot: icon via DataTable lookup, cooldown timer, activation highlight.
W_EnemyAvatar
Enemy UI root, instanced per enemy actor above their head.
W_EnemyHealthBar
Reactive enemy Health and Shield bars.
Structure

Gameplay Tags

GameplayAbility. ├── Active — Added to ASC while any ability is active ├── Death — Activates GA_Death ├── HitReaction — Activates GA_HitReaction └── [ability tags] — Unique tag per ability State. ├── Death — Blocks all abilities when present └── Buff.Immunity — Halves incoming damage via MMC Data. └── Damage — SetByCaller channel for damage magnitude Effect. └── HitReaction — Marks GEs that should trigger hit reaction Event. └── Abilities.Changed — Notifies UI to rebuild ability bar GameplayCue. ├── Damage.Burst — Impact VFX and sound └── AOE.* — Area attack visual indicators
Reusability

Enemy system

The enemy shares the exact same AGameCharacterBase architecture as the player.

Highlights

More technical detail

AnimNotify sync

All offensive abilities synchronize with animation frames via AnimNotify → WaitGameplayEvent, fully decoupled from timing.

SetByCaller

A single damage GE asset is reused by every offensive ability, each supplying a different runtime magnitude.

HitActorArray

Anti-duplicate filter for volume-based hit detection, used in melee HitScan and AOE SphereTrace.

3-level BP inheritance

GA_MeleeAttack_BaseGA_MeleeAttack_AxeSwingGA_MeleeAttack_AxeCombo.

Equip as a Gameplay Ability

Weapon equipping runs through GAS infrastructure itself: cooldown, death blocking, AnimNotify sync, dynamic granting.

CurveTable scaling

The shield ability scales with character level through a CurveTable, without creating multiple effect assets.

Tech stack

Built with

Engine
Unreal Engine 5.6.1
Language
C++ & Blueprints
IDE
JetBrains Rider
Framework
Gameplay Ability System (GAS)
UI
UMG (Unreal Motion Graphics)
VFX
Niagara + Gameplay Cues
Animation
Animation Montages + AnimNotifies
Data
DataTables + CurveTables
📦 Solo project, repository maintained by me. github.com/DarioCalderonTornero/GAS_SYSTEM_TFG →
📄 Full thesis writeup — coming soon.