Gameplay · Updated Apr 14, 2026

Overshield FX & ShieldDepleted Cue

Overshield FX & ShieldDepleted Cue

Character-side visual feedback for the overshield state and shield depletion event. TP mesh only — no FP overlay.


#Visual Strategy

StateVisual
Regular shield activeNone — HUD only
Overshield activeOverlay material on TP mesh, optional looping Niagara
Overshield depletedOne-shot break flash + optional burst Niagara
Shield depleted (hits 0)One-shot crack flash + optional burst Niagara

Niagara is optional per component — null means overlay-only. Keeps the persistent overshield state cheap.


#Trigger Sources

Three character events on ASLCharacterBase already fire at the right moments, called from USLHealthWidget via attribute change delegates. All three fire on the owning client only.

Character eventWhenSource
OnOvershieldActivated()Overshield percent crosses from 0 → > 0SLHealthWidget::BroadcastCurrentValues
OnOvershieldDepleted()Overshield percent crosses from > 0 → 0SLHealthWidget::BroadcastCurrentValues
OnShieldDepleted()CurrentShield crosses from > 0 → 0SLHealthWidget::HandleCurrentShieldChanged

GC_SL_ShieldDepleted (burst cue, fired from USLDamageExecution) additionally runs on all clients so other players see the shield depleted FX on the TP mesh.


#Part 1 — Blueprint FX Components on BP_SL_MasterChief

Three pure Blueprint ActorComponents (parent class UActorComponent), each configured for one status. No C++ base — the character events drive them directly.

Variable nameLoopingOverlayNiagaraTriggered by
C_OvershieldActiveFXYes — stays until DeactivateMI_SL_OvershieldActiveNS_Player_Buff_Looping (placeholder)OnOvershieldActivatedActivate / OnOvershieldDepletedDeactivate
C_OvershieldDepletionFXNo — one-shotMI_SL_OvershieldDepletionoptional burst NSOnOvershieldDepletedActivate (alongside deactivating the above)
C_ShieldDepletedFXNo — one-shotMI_SL_ShieldDepletedoptional burst NSGC_SL_ShieldDepleted::OnBurstActivate (all clients)

#Component interface (implement in each BP)

Each component exposes two functions wired in its own event graph:

Activate()

  • If OverlayMaterial is set: create Dynamic MI, call SetOverlayMaterial(DynamicMI) on the TP mesh
  • If NiagaraSystem is set: spawn/activate Niagara attached to TP mesh
  • If one-shot: start a timer for ActiveDuration → call Deactivate() on finish

Deactivate()

  • Run a Timeline (DeactivateFadeDuration) driving EmissiveIntensity on the Dynamic MI to 0
  • On Timeline Finished: SetOverlayMaterial(null), deactivate/destroy Niagara
  • Set playback rate to 1.0 / DeactivateFadeDuration so duration is data-driven per instance

#Part 2 — Wiring in BP_SL_MasterChief

Override the three character events in the character BP:


OnOvershieldActivated  →  C_OvershieldActiveFX.Activate()

OnOvershieldDepleted   →  C_OvershieldActiveFX.Deactivate()

                          C_OvershieldDepletionFX.Activate()

OnShieldDepleted       →  (audio already wired here — no component call needed,

                           C_ShieldDepletedFX is driven by the GC_SL_ShieldDepleted cue)


#Part 3 — GC_SL_ShieldDepleted (GameplayCueNotify_Burst)

Fires on all clients via ExecuteGameplayCue in USLDamageExecution. Handles the TP mesh visual for other players — the owning client's audio is already handled by OnShieldDepleted.

Path: Content/SystemLink/AbilitySystem/Cues/HealthAndShield/GC_SL_ShieldDepleted Tag: GameplayCue.Character.ShieldDepleted

OnBurst:

  • Cast target to BP_SL_MasterChiefC_ShieldDepletedFX.Activate()

#Part 4 — Overlay Materials

The UI materials (MI_MC_OverShieldBg, MI_MC_OverShieldFill) are HUD-only — cannot be applied to a skeletal mesh. Create three new instances from Content/Library/NiagaraExamples/Materials/MasterMaterials/M_Mesh_Overlay.

AssetPathColor / Feel
MI_SL_OvershieldActiveContent/SystemLink/Characters/Materials/Steady blue/cyan glow
MI_SL_OvershieldDepletionContent/SystemLink/Characters/Materials/Blue→white flash, high emissive spike
MI_SL_ShieldDepletedContent/SystemLink/Characters/Materials/White/grey crack flash

Expose EmissiveIntensity on each — driven at runtime via Dynamic MI for the fade Timeline.


#Part 5 — C++ Changes (done)

#SLTags.h / SLTags.cpp

SLTags::GameplayCues::Character::ShieldDepleted — native tag, "GameplayCue.Character.ShieldDepleted".

#USLDamageExecution::Execute_Implementation

Fires when ShieldDamage >= CurrentShield (shield will be zeroed by this hit):


if (ShieldDamage > 0.f && ShieldDamage >= CurrentShield)

{

    UAbilitySystemComponent* TargetASC = ExecutionParams.GetTargetAbilitySystemComponent();

    if (TargetASC)

    {

        FGameplayCueParameters CueParams;

        const AActor* Avatar = TargetASC->GetAvatarActor();

        CueParams.Location = Avatar ? Avatar->GetActorLocation() : FVector::ZeroVector;

        TargetASC->ExecuteGameplayCue(SLTags::GameplayCues::Character::ShieldDepleted, CueParams);

    }

}


#New Assets Summary

AssetPathType
C_OvershieldActiveFXAdded to BP_SL_MasterChiefBlueprint ActorComponent
C_OvershieldDepletionFXAdded to BP_SL_MasterChiefBlueprint ActorComponent
C_ShieldDepletedFXAdded to BP_SL_MasterChiefBlueprint ActorComponent
MI_SL_OvershieldActiveContent/SystemLink/Characters/Materials/Material Instance
MI_SL_OvershieldDepletionContent/SystemLink/Characters/Materials/Material Instance
MI_SL_ShieldDepletedContent/SystemLink/Characters/Materials/Material Instance
GC_SL_ShieldDepletedContent/SystemLink/AbilitySystem/Cues/HealthAndShield/GameplayCueNotify_Burst

#Build Order

  1. C++ — done. ShieldDepleted tag + ExecuteGameplayCue in USLDamageExecution. Compiled.
  1. Materials — create three overlay MIs from M_Mesh_Overlay master.
  1. Components — add three Blueprint ActorComponents to BP_SL_MasterChief, implement Activate / Deactivate in each.
  1. Character BP wiring — override OnOvershieldActivated, OnOvershieldDepleted to drive the components.
  1. Depleted cue — create GC_SL_ShieldDepleted burst BP, cast target → C_ShieldDepletedFX.Activate().
  1. Test — use ASLTestDamageEmitter:
    • Pick up overshield → C_OvershieldActiveFX activates → blue overlay on TP mesh
    • Burn through overshield → C_OvershieldActiveFX deactivates + C_OvershieldDepletionFX fires
    • Continue taking damage → no overlay
    • Shield hits 0 → C_ShieldDepletedFX fires on all clients via cue