A solo technical demo built in Unreal Engine 5, implementing a fully functional, modular Gameplay Ability System from scratch in C++.
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.
The entire base architecture is built in C++, establishing a solid foundation that Blueprints extend without compromising its integrity.
GrantAbilities and RemoveAbilities in AGameCharacterBase, returning handle arrays for precise revocation.A complete centralized pipeline processes every hit before applying it to real attributes.
GameplayEffectSpec and assigns damage via SetByCallerMagnitude with tag Data.Damage.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.GameplayCue.Damage.Burst) fires automatically from the GE asset — VFX and sound without any ability-side logic.Effect.HitReaction and damage was greater than zero.GE_Death which adds the State.Death tag — blocking all abilities instantly.The UI never polls the system — it reacts to changes pushed by the ASC.
The enemy shares the exact same AGameCharacterBase architecture as the player.
UExtendedAbilitySystemComponent and UBasicAttributeSet.BPI_Target interface.HasPlayerController() utility in UMyPlayerGameplayAbility lets abilities branch behaviour between player and enemy without separate classes.GA_MeleeAttack_AxeCombo sets OverrideContinueCombo = !HasPlayerController() — auto-continues for the enemy, requires input for the player.All offensive abilities synchronize with animation frames via AnimNotify → WaitGameplayEvent, fully decoupled from timing.
A single damage GE asset is reused by every offensive ability, each supplying a different runtime magnitude.
Anti-duplicate filter for volume-based hit detection, used in melee HitScan and AOE SphereTrace.
GA_MeleeAttack_Base → GA_MeleeAttack_AxeSwing → GA_MeleeAttack_AxeCombo.
Weapon equipping runs through GAS infrastructure itself: cooldown, death blocking, AnimNotify sync, dynamic granting.
The shield ability scales with character level through a CurveTable, without creating multiple effect assets.