Skip to main content

Channel System

Channels let you route, mute, and scale responses by FGameplayTag category — without touching individual Response Assets.

Overview

Every Response Asset has a Channels property (FGameplayTagContainer). When a response is played:

  1. If any of its channels are muted → the response is dropped entirely
  2. If any of its channels have an intensity override → the lowest override is applied

Channels are additive tags on an asset — a response can belong to multiple channels simultaneously.

Example Channel Tags

Design your own hierarchy using the GameplayTag editor:

ElysImpact.Channel.Audio
ElysImpact.Channel.Audio.Impact
ElysImpact.Channel.Visual.Camera
ElysImpact.Channel.Visual.PostProcess
ElysImpact.Channel.Gameplay.Damage
ElysImpact.Channel.UI

Muting Channels

// Blueprint: Mute Channel node
// C++:
UERP_ImpactStatics::MuteChannel(this, FGameplayTag::RequestGameplayTag("ElysImpact.Channel.Audio"));

// Unmute:
UERP_ImpactStatics::UnmuteChannel(this, FGameplayTag::RequestGameplayTag("ElysImpact.Channel.Audio"));

Use cases:

  • Mute Audio.Impact during cutscenes
  • Mute Visual.Camera during menus
  • Mute Gameplay.Damage during tutorial

Per-Channel Intensity

Scale the intensity of an entire channel without muting it:

// Halve all camera effect responses:
UERP_ImpactStatics::SetChannelIntensity(this, CameraChannel, 0.5f);

// Restore:
UERP_ImpactStatics::SetChannelIntensity(this, CameraChannel, 1.0f);

When a response asset belongs to multiple channels, the lowest channel intensity wins.

Use cases:

  • Visual.PostProcess → 0.3 on low graphics settings
  • Audio.Impact → 0.5 when background music is loud
  • Visual.Camera → 0.0 for players with camera shake accessibility preference

Global Intensity

Set the intensity multiplier for all responses simultaneously:

// Blueprint: Set Global Intensity node
UERP_ImpactStatics::SetGlobalIntensity(this, 0.5f); // halve everything
UERP_ImpactStatics::SetGlobalIntensity(this, 1.0f); // restore

Per-Component Channel Filtering

UERP_ImpactComponent has a MutedChannels property. Any response played through the component automatically filters out the specified channels — useful for actors that should never trigger certain effects regardless of what asset is used.

// In C++, add channels to mute at BeginPlay:
ImpactComponent->MutedChannels.AddTag(AudioChannel);

Interaction with Feel Profile

The active UERP_FeelProfile::ForceMutedChannels adds to the global muted set — any channel listed there is silenced regardless of per-channel state. This is the correct way to apply a global suppression from a profile (e.g., a Cinematic profile that silences all audio responses).

Best Practices

  • Design your channel tag hierarchy before building assets — changing tags later requires updating all assets
  • Use ElysImpact.Channel.* as your root to keep tags organized
  • Prefer channel muting over deleting/disabling individual handlers for runtime overrides
  • Use SetChannelIntensity(Channel, 0.0) instead of MuteChannel when you want responses to “exist but be silent” (e.g., so they still accumulate DI)