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
| State | Visual |
|---|---|
| Regular shield active | None — HUD only |
| Overshield active | Overlay material on TP mesh, optional looping Niagara |
| Overshield depleted | One-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 event | When | Source |
|---|---|---|
OnOvershieldActivated() | Overshield percent crosses from 0 → > 0 | SLHealthWidget::BroadcastCurrentValues |
OnOvershieldDepleted() | Overshield percent crosses from > 0 → 0 | SLHealthWidget::BroadcastCurrentValues |
OnShieldDepleted() | CurrentShield crosses from > 0 → 0 | SLHealthWidget::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 name | Looping | Overlay | Niagara | Triggered by |
|---|---|---|---|---|
C_OvershieldActiveFX | Yes — stays until Deactivate | MI_SL_OvershieldActive | NS_Player_Buff_Looping (placeholder) | OnOvershieldActivated → Activate / OnOvershieldDepleted → Deactivate |
C_OvershieldDepletionFX | No — one-shot | MI_SL_OvershieldDepletion | optional burst NS | OnOvershieldDepleted → Activate (alongside deactivating the above) |
C_ShieldDepletedFX | No — one-shot | MI_SL_ShieldDepleted | optional burst NS | GC_SL_ShieldDepleted::OnBurst → Activate (all clients) |
#Component interface (implement in each BP)
Each component exposes two functions wired in its own event graph:
Activate()
- If
OverlayMaterialis set: create Dynamic MI, callSetOverlayMaterial(DynamicMI)on the TP mesh
- If
NiagaraSystemis set: spawn/activate Niagara attached to TP mesh
- If one-shot: start a timer for
ActiveDuration→ callDeactivate()on finish
Deactivate()
- Run a Timeline (
DeactivateFadeDuration) drivingEmissiveIntensityon the Dynamic MI to 0
- On Timeline Finished:
SetOverlayMaterial(null), deactivate/destroy Niagara
- Set playback rate to
1.0 / DeactivateFadeDurationso 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_MasterChief→C_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.
| Asset | Path | Color / Feel |
|---|---|---|
MI_SL_OvershieldActive | Content/SystemLink/Characters/Materials/ | Steady blue/cyan glow |
MI_SL_OvershieldDepletion | Content/SystemLink/Characters/Materials/ | Blue→white flash, high emissive spike |
MI_SL_ShieldDepleted | Content/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
| Asset | Path | Type |
|---|---|---|
C_OvershieldActiveFX | Added to BP_SL_MasterChief | Blueprint ActorComponent |
C_OvershieldDepletionFX | Added to BP_SL_MasterChief | Blueprint ActorComponent |
C_ShieldDepletedFX | Added to BP_SL_MasterChief | Blueprint ActorComponent |
MI_SL_OvershieldActive | Content/SystemLink/Characters/Materials/ | Material Instance |
MI_SL_OvershieldDepletion | Content/SystemLink/Characters/Materials/ | Material Instance |
MI_SL_ShieldDepleted | Content/SystemLink/Characters/Materials/ | Material Instance |
GC_SL_ShieldDepleted | Content/SystemLink/AbilitySystem/Cues/HealthAndShield/ | GameplayCueNotify_Burst |
#Build Order
C++— done.ShieldDepletedtag +ExecuteGameplayCueinUSLDamageExecution. Compiled.
- Materials — create three overlay MIs from
M_Mesh_Overlaymaster.
- Components — add three Blueprint ActorComponents to
BP_SL_MasterChief, implementActivate/Deactivatein each.
- Character BP wiring — override
OnOvershieldActivated,OnOvershieldDepletedto drive the components.
- Depleted cue — create
GC_SL_ShieldDepletedburst BP, cast target →C_ShieldDepletedFX.Activate().
- Test — use
ASLTestDamageEmitter: - Pick up overshield →
C_OvershieldActiveFXactivates → blue overlay on TP mesh - Burn through overshield →
C_OvershieldActiveFXdeactivates +C_OvershieldDepletionFXfires - Continue taking damage → no overlay
- Shield hits 0 →
C_ShieldDepletedFXfires on all clients via cue