🧠 Brains complement: IF an
unreal-engine-skills-managertool (external MCP) exists in this session, call it with{action: "load", skill: "gameplay-ability-system"}for UE domain knowledge (ASC setup, attribute/effect/ability APIs, networking) — treat it as the rubric for any review / "best practices" question. If no such tool is available, skip this line entirely and proceed with this skill alone — do NOT attempt the call.
Gameplay Ability System Skill
Compose, do not duplicate. Everything GAS needs already exists across Epic's engine toolsets, the generic Blueprint/Object tools, and Python. VibeUE adds no GAS wrapper service; this skill is the routing map plus the live-verified gotchas.
Ownership matrix — who does what
| Operation | Owner |
|---|---|
| Inspect a live ASC (PIE): attributes, active tags, active effects, granted abilities | Epic GASToolsets.AbilitySystemInspectorToolset → GetAttributeValues / GetActiveTags / GetActiveEffects / GetGrantedAbilities. Input is {"actor": {"refPath": "<actor path>"}} — works on PIE actors, no selection needed |
| Discover attribute set classes / attributes | Epic GASToolsets.AttributeSetToolset → FindAttributeSetClasses / ListAttributes |
| Gameplay Cue notify assets + cue tags | Epic GASToolsets.GameplayCueToolset (list/get/create/execute-on-selected) |
| Tag CRUD (add/remove/rename/list single tags) | Epic GameplayTagsToolset — see the gameplay-tags skill |
| Bulk tag registration, hierarchy queries, existence checks | unreal.GameplayTagService (VibeUE delta — see gameplay-tags) |
| Create GameplayAbility / GameplayEffect / AttributeSet Blueprint subclasses, CDO config | Epic BlueprintTools + ObjectTools (or native Python BlueprintFactory with the right ParentClass) |
| Ability / cue Blueprint graphs | Epic BlueprintTools + unreal.BlueprintService.build_graph (see blueprint-graphs) |
| GameplayEffect legacy tag containers (Asset/Target Tags) | unreal.BlueprintService.set_property — maps them onto the UE 5.3+ GE Components (VibeUE #539/#541) |
| Runtime PIE testing | EditorToolset.EditorAppToolset StartPIE/StopPIE + Python on live actors (below) |
| Native C++ attribute sets / effects / abilities | Coding-agent handoff — C++ patterns below are for that agent, not for editor tools |
Python exposure facts (live-verified, UE 5.8)
UAbilitySystemBlueprintLibraryis exposed asunreal.AbilitySystemLibrary(the "BlueprintLibrary" name does not exist in Python).asc = unreal.AbilitySystemLibrary.get_ability_system_component(actor).FGameplayTagcannot be constructed from raw Python:unreal.GameplayTag(tag_name=...)is rejected,TagNameis read-only viaset_editor_property, andGameplayTagLibrary.make_literal_gameplay_tagtakes an FGameplayTag (circular). Use VibeUE's escape hatch:unreal.GameplayTagService.request_tag("A.B.C")returns the real registered tag VALUE (invalid tag for unknown names — check withGameplayTagLibrary.is_gameplay_tag_valid), andrequest_tag_container([...])batches into a container. That unlocks every tag-typed API:asc.has_matching_gameplay_tag,send_gameplay_event_to_actor,assign_tag_set_by_caller_magnitude, tag-keyedTMapauthoring, and tag queries. For pure READS the Epic inspectorGetActiveTagsalso returns tag names as strings without needing tag values.asc.get_owned_gameplay_tags()is NOT exposed. Use the inspector.- ASC
BlueprintCallables that take a class work fine:asc.try_activate_ability_by_class(unreal.MyGA_Class)— this is the reliable Python path to drive abilities in PIE (it bypasses any component-level gates, which makes tests deterministic). - Multiple activations inside ONE
execute_python_codecall happen in the same frame — no timers tick and no GE durations expire between them. Exploit this to hit caps/lockouts deterministically instead of sleeping wall-clock time.
PIE verification recipe (one round-trip per step)
pythonimport unreal, json world = unreal.get_editor_subsystem(unreal.UnrealEditorSubsystem).get_game_world() pawn = unreal.GameplayStatics.get_player_pawn(world, 0) ref = json.dumps({"actor": {"refPath": pawn.get_path_name()}}) for tool in ["GetAttributeValues", "GetActiveTags", "GetActiveEffects", "GetGrantedAbilities"]: r = unreal.ToolsetRegistry.execute_tool("GASToolsets.AbilitySystemInspectorToolset", tool, ref) print(tool, r.get_value_as_json_string()) # drive an ability and re-inspect IN THE SAME CALL for deterministic assertions asc = unreal.AbilitySystemLibrary.get_ability_system_component(pawn) asc.try_activate_ability_by_class(unreal.MyGA_Fire)
Damage through the classic funnel also exercises GE pipelines when the project routes
TakeDamage into effects: unreal.GameplayStatics.apply_damage(actor, 25.0, None, None, None).
C++ authoring gotchas (for the coding-agent handoff)
- Never call
UGameplayEffect::FindOrAddComponent/AddComponentin a GE constructor — theyNewObjectwith an empty name, which fatal-asserts at CDO construction and kills the editor on module load. In constructors useCreateDefaultSubobject<UTargetTagsGameplayEffectComponent>(TEXT("TargetTags")), callSetAndApplyTargetTagChanges(...), thenGEComponents.Add(...)(protected — do it inside the class). - SetByCaller cost/cooldown GEs:
CommitAbilityalone applies a 0-magnitude spec and logs a warning. OverrideApplyCost/ApplyCooldown, build the spec withMakeOutgoingGameplayEffectSpec,SetSetByCallerMagnitude(tag, value), thenApplyGameplayEffectSpecToOwner. AbilityTagsis deprecated in 5.5+ — callSetAssetTags(container)in the constructor.NonInstancedinstancing is deprecated — default toInstancedPerActor.UAbilitySystemGlobals::Get().InitGlobalData()must run once at startup (GameInstance::Init / AssetManager) or target data and montage prediction fail silently.- Set
[/Script/GameplayAbilities.AbilitySystemGlobals]+GameplayCueNotifyPaths=/Game/GameplayCuesin DefaultGame.ini, or the cue manager scans all of /Game/ (startup warning + cost).
Verification rules
After authoring: compile (unreal.BlueprintEditorLibrary.compile_blueprint), then prove behavior
in PIE with the inspector — a successful tool call is not evidence. Attribute deltas, active-tag
presence, and effect duration/stack readouts are the evidence to report.


