Configuration Reference
Documentation Unreal Engine AI Configuration Reference
Complete reference for all data assets: AICombatConfig, ActionSets, Movement Profiles, and Damage Config.
All data assets in one place. Link here from system pages for specific configuration details.
EnemyAIConfig
Defines combat role selection, behavior logic, and action set binding for an AI.
Config Resolution Order:
- Pawn implementing
IEnemyAIConfigProvider SECCombatControllerComponent'sDefaultAIConfig, when the pawn supplies none
Set the config on the pawn for per-enemy customization, or on the
SECCombatControllerComponent's DefaultAIConfig when all units sharing a controller should use the same config.SECCombatControllerComponent Properties
AI|SEC
Default AI Config
None
AI|SEC|Combat Role
Auto Register For Combat Roles
AI|SEC|Threat Response
Enable Threat Detection
AI|SEC|Weapon
Drop Weapon On Death
AI|SEC|Vitals
Auto Handle Death On Health Depleted
| Property | Purpose |
|---|---|
| Default AI Config | Fallback AI Config when the pawn provides none |
| Auto Register For Combat Roles | Register with the role subsystem on possession |
| Enable Threat Detection | Turn on ThreatDetectionComponent at BeginPlay |
| Drop Weapon On Death | Drop the equipped weapon with physics on death. Untick to handle the drop yourself, from an AnimNotify or K2_OnDeath. |
| Auto Handle Death On Health Depleted | Run HandleDeath() when the health vital empties |
SECCombatControllerComponent Delegates
| Delegate | Purpose |
|---|---|
OnCombatRoleChanged | Broadcast when combat role changes (new role, old role) |
OnCombatTargetLost | Broadcast when assigned combat target is destroyed/unregistered |
OnCombatRoleSystemReady | Broadcast after successful registration with the role subsystem. Safe to call ForceAssignRole here. |
OnDeath | Broadcast at the end of HandleDeath(), after all combat systems are shut down. Safe to enable ragdoll, play death VFX, or destroy the actor here. |
MovementBehaviorProfile Threat Response
These settings live on the
MovementBehaviorProfile data asset, so they automatically change when the AI switches combat roles:Details
Movement Behavior Profile (MovementBehaviorProfile)
Threat Response
Swap Strafe On High Threat
Adjust Distance By Threat
Threat Distance Scale
1
Role-swapped fields on the active movement profile. Make* presets leave both flags false.
Threat Distance Scale feeds
DistMultiplier = 1.0 + ThreatLevel * Scale, and stays greyed out until Adjust Distance By Threat is on.The asset in the editor
An
EnemyAIConfig opens as four groups. Role registration and target selection:Combat Role
Auto-Register for Combat Roles
Allowed Roles (empty = any)
0 Gameplay Tags
Priority
0
Preferred Role
None
Fitness Evaluators
0 Array elements
Target Selector
None
Ignore Target Redistribution
Which brain runs, and what the decision context feeds it:
Details
Enemy AI Config (EnemyAIConfig)
Behavior
Default State Tree
Content/SoulslikeEnemyCombat/.../StateTree_SEC_Core
Decision Context Params
Aggression Level
1
Window Id Interval Seconds
1.0
LOS Trace Channel
Visibility
LOS Trace Complex
Empty Default State Tree runs the native combat loop. Decision Context Params feed Build Decision Context and the native brain.
The sets it swaps per role. Each Role ... Sets array pairs a role tag with an asset, so an Attacker and a Flanker can run different moves off the same enemy:
Action Sets
Manage Action Sets Automatically
Default Action Set
DA_SEC_ActionSet_Attacker
Role Action Sets
3 Array elements
Reaction Sets
Manage Reaction Sets Automatically
Default Reaction Set
DA_SEC_ReactionSet_Default
Role Reaction Sets
1 Array element
Movement Profiles
Manage Movement Profiles Automatically
Default Movement Profile
DA_SEC_Movement_Attacker
Role Movement Profiles
2 Array elements
Perception memory, off until you assign a config:
Details
Enemy AI Config (EnemyAIConfig)
Awareness
Manage Awareness Automatically
Awareness Config
DA_EnemyAwareness
Awareness category on the config asset assigned to the pawn via IEnemyAIConfigProvider.
C++The asset in C++
// Role Registration
bool bAutoRegisterForCombatRoles; // Auto-register with role subsystem
FAIRoleRegistrationParams RoleRegistrationParams;
TArray<FGameplayTag> AllowedRoles; // Roles this AI can take; empty means any
int32 Priority; // Tiebreaker on equal fitness
FGameplayTag PreferredRole; // Small bonus toward this role
TArray<URoleEvaluator*> FitnessEvaluators; // Scoring objects for role assignment
// Target Selection
UTargetSelector* TargetSelector; // Per-AI target selector (instanced)
bool bIgnoreTargetRedistribution; // Opt out of periodic target reshuffling
// Behavior
UStateTree* StateTree; // Optional StateTree; empty = native C++ combat loop
FSECDecisionContextParams DecisionContextParams; // Tunables for the decision context
// Action Set Management
bool bManageActionSetsAutomatically; // Swap ActionSets based on role
UActionSet* DefaultActionSet; // Fallback ActionSet
TArray<FRoleActionSetConfig> RoleActionSets; // Per-role ActionSets
// Reaction Set Management
bool bManageReactionSetsAutomatically; // Swap ReactionSets based on role
UReactionSet* DefaultReactionSet; // Fallback ReactionSet
TArray<FRoleReactionSetConfig> RoleReactionSets; // Per-role ReactionSets
// Movement Profile Management
bool bManageMovementProfilesAutomatically; // Swap Movement Profiles based on role
UMovementBehaviorProfile* DefaultMovementProfile; // Fallback Profile
TArray<FRoleMovementProfileConfig> RoleMovementProfiles; // Per-role Profiles
// Awareness
bool bManageAwarenessAutomatically; // Apply AwarenessConfig on possession (default true)
USECAwarenessConfig* AwarenessConfig; // Perception memory tuning; unset leaves awareness offDecision Context Params
DecisionContextParams (a FSECDecisionContextParams, under Behavior) tunes how the decision context is built each tick. STTask_BuildDecisionContext resolves these from the config on EnterState, so they travel with the config rather than living on the StateTree node.| Property (editor label) | Default | Purpose |
|---|---|---|
AggressionLevel | 1.0 | Baseline aggression written into the decision context. 0 = defensive, 1 = balanced, 2 = aggressive. Clamped 0-2. |
WindowIdIntervalSeconds | 1.0 | Seconds between window increments that reseed score variation. 0 = never advance. |
LineOfSightTraceChannel ("LOS Trace Channel") | Visibility | Collision channel for the line-of-sight trace. Point it at a dedicated visibility channel if the project has one. |
bLineOfSightTraceComplex ("LOS Trace Complex") | false | Trace against complex (per-poly) collision. Off uses simple collision (faster). |
Decision-context health and stamina come from the pawn's vitals (health else 1.0, stamina else 100, when the pawn carries no vitals component or no row for the configured tag).FSECDecisionContextParamsholds no GAS attribute fields. For attribute-backed health or stamina scoring, use an Attribute Scorer or Attribute Gate on the action instead.
Recovery
Recovery group on UEnemyAIConfig. After an enemy commits an action, these suspend its offensive action selection while movement and reactions keep running. Every field defaults to 0, so recovery is off and existing configs are unchanged until you set one. See Recovery Time for the full behavior.// Recovery
float ActionRecoveryTime; // Seconds suspended after an action completes or times out (0 = off)
float InterruptRecoveryTime; // Seconds suspended after an interrupt or cancel; keep below ActionRecoveryTime
float ActionRecoveryTimeRandomization; // ± jitter on completion recovery, so a pack does not act in lockstep
TObjectPtr<USECActionHook> GlobalHook; // Optional instanced lifecycle hook run for every action this enemy commitsA single action can replace the global window. On itsFActionSpecRecovery group, setbOverrideRecoveryTimeandRecoveryTime(absolute, not additive). Completion uses the override if set; interrupt or cancel always usesInterruptRecoveryTime; a timeout always uses the globalActionRecoveryTime.
ActionSet
Used by: Action System
Contains an array of
FActionSpec, which are all available actions for an AI.Creating an ActionSet
- Right-click → Miscellaneous → Data Asset → ActionSet
- Add actions to the Actions array
- Configure each action's properties
FActionSpec Structure
struct FActionSpec
{
// Identity
FName ActionId; // Unique identifier within the set
// Execution: instanced method that owns how the action runs
TObjectPtr<USECExecutionMethod> ExecutionMethod; // Gameplay Ability, Behavior Tree Sequence, or your own subclass
// Scoring
float SelectionWeight; // Base priority multiplier
float RiskPenalty; // Divides the final score (1.0 = no penalty)
TMap<FGameplayTag, float> TagScoreMultipliers; // Situational tag multipliers
FSECCustomScoring CustomScoring; // Scoring list: Scorers (multiply) + Gates (veto)
// Cooldowns
FActionCooldown Cooldown;
float Duration; // Time before reuse
float InitialCooldown; // Cooldown applied on spawn
float Randomization; // Cooldown randomness, 0.2 means ±20% (default 0.2)
float InterruptRefund; // Share of the remaining cooldown handed back on interrupt (default 0)
float SpawnCooldownChance; // Chance to start on cooldown at spawn, desyncing a group (default 0)
int32 MaxConsecutiveUses; // Consecutive uses before another action must run; -1 is unlimited
// Chaining
TArray<FActionChainLink> ChainLinks; // Follow-ups this action prefers
FName TargetActionId; // Action ID of the follow-up
float BonusMultiplier; // Score multiplier it receives (default 1.5)
// Preconditions (Hard Gates)
FGameplayTagContainer RequiresTags;// Must have these to use
FGameplayTagContainer BlockTags; // Cannot use if these exist
bool bRequireLineOfSight; // Only fire with a clear LOS to target
FGameplayTagContainer AddTags; // Added while action active
};Distance, angle, health, speed, and stamina are not fields onFActionSpec. They are opt-in entries in theCustomScoringlist. Add a built-in Distance Scorer, Angle Scorer, Health Scorer, Speed Scorer, Stamina Gate, Vital Scorer, or Vital Gate to score or gate on those dimensions. See Built-in Scorers & Gates below. An action with no Distance Scorer is distance-agnostic.
FRangeEval Explained
The sweet-spot curve used as the
Range on the Distance, Angle, Health, and Speed Scorers, and as the ValueEval on the Attribute Scorer:Range
Min Value
0
Optimal Min
100
Optimal Max
250
Max Value
500
Exponent
2
Clamp To Zero
The ramp between an edge and the sweet spot is a curve, not a step: the distance from the edge is raised to Exponent. Clamp To Zero holds the score at zero outside the range instead of letting it go negative.
C++The struct in C++
struct FRangeEval
{
float MinValue; // Score = 0 below this (invalid)
float OptimalMin; // Score = 1.0 starts here
float OptimalMax; // Score = 1.0 ends here
float MaxValue; // Score = 0 above this (invalid)
float Exponent; // Falloff sharpness outside the sweet spot (default 2.0)
bool bClampToZero; // Hold the score at zero outside the range (default true)
};Example: A Distance Scorer valid 0-400cm, optimal 100-250cm:
Range.MinValue = 0;
Range.OptimalMin = 100;
Range.OptimalMax = 250;
Range.MaxValue = 400;Built-in Scorers & Gates
Distance, angle, health, speed, and stamina are opt-in. Add an entry to an action's Scoring list (
CustomScoring), pick one of the built-in classes, and tune its single property. Omit the entry and that dimension does not influence the score. Scorers fold a multiplier into the score (1.0 = no effect); Gates veto the action when they fail. For deeper coverage and the GetDisplayName() labeling hook, see Scorers & Gates.| Class (editor name) | Property | Default | Reads | Notes |
|---|---|---|---|---|
| Distance Scorer | Range (FRangeEval) | MakeMeleeRange() | AI-to-target distance (cm), 0 with no target | Range OptimalMin/Max also feed the positioning query (GetIdealDistanceForAction) |
| Angle Scorer | Range (FRangeEval) | MakeFrontalAngle() | Absolute angle to target (deg), 0 facing it, 0 with no target | |
| Health Scorer | Range (FRangeEval) | MakeAlwaysOne() | AI health 0-1, sourced from the pawn's health vital | For any other pool use Vital Scorer; for a GAS health attribute use an Attribute Scorer |
| Speed Scorer | Range (FRangeEval) | MakeAlwaysOne() | AI horizontal speed (cm/s) | |
| Vital Scorer | VitalTag, bUseFraction, Range (FRangeEval) | true / MakeAlwaysOne() | Any named vital, as a fraction or raw value | The general form behind Health Scorer; no effect on a pawn without the vital |
| Stamina Gate | MinStamina | 0 | Decision-context Stamina, sourced from the pawn's stamina vital (100 by default) | Vetoes unless Stamina >= MinStamina; for any other pool use Vital Gate, for a GAS stamina attribute use an Attribute Gate |
| Vital Gate | VitalTag, MinValue, bUseFraction | 0 / false | Any named vital, as a fraction or raw value | The general form behind Stamina Gate; no effect on a pawn without the vital |
| Attribute Scorer | Attribute, NormalizeBy, ValueEval (FRangeEval) | n/a | A GameplayAttribute on the owning ASC | Optionally divide by NormalizeBy (e.g. Mana / MaxMana) before scoring |
| Attribute Gate | Attribute, MinValue, MaxValue | 0 / 0 | A GameplayAttribute on the owning ASC | Pass when the attribute is in [MinValue, MaxValue]; MaxValue <= 0 disables the upper bound |
The decision context never reads GAS health or stamina attributes. Health and stamina come from the pawn's vitals (health else 1.0, stamina else 100). For GameplayAttribute-backed health, stamina, mana, or any other pool, use an Attribute Scorer or Attribute Gate on the action; for any other authored vital, use a Vital Scorer or Vital Gate.
Auto-migration: existing ActionSets migrate once on load. Each action's oldDistanceEvalbecomes a Distance Scorer andAngleEvalan Angle Scorer; a non-default Health or Speed range becomes a Health or Speed Scorer; aStaminaCostabove 0 becomes a Stamina Gate. Scoring is unchanged. Re-save the asset to persist. New actions ship with an empty Scoring list (distance-agnostic until you add a Distance Scorer).
MovementBehaviorProfile
Used by: Movement System
The role-swappable data asset. It holds only the fields a combat role changes. The rest of the movement tuning (avoidance, hybrid switching, detour, navmesh sampling, strafe feel) lives on the
MovementEvaluatorComponent itself, the same for every role. See the Movement System for that surface.Full Structure
// Distance
float DesiredDistance; // Ideal distance to hold (cm), default 400
float DistanceTolerance; // Far half of the comfort band as a fraction of desired (0.05-0.5), default 0.2
float CrowdTolerance; // Near half, how far a target may press in before the AI gives ground (0.05-0.9), default 0.45
// Strafe Rest (fatigue)
bool bEnableStrafeRest; // Rest after continuous strafing, default true
float StrafeRestTimeLimit; // Seconds of strafing before a rest (3-60), default 10
float StrafeRestDuration; // Rest length in seconds (0.5-10), default 1.5
// Threat Response
bool bSwapStrafeOnHighThreat; // Swap strafe side under high threat, default false
bool bAdjustDistanceByThreat; // Back off as threat rises, default false
float ThreatDistanceScale; // How strongly threat pushes distance out (0-5), default 1.0
// Custom Rules
TArray<UPositioningRule*> PositioningRules; // Instanced direction modifiers, empty by defaultExample Profile
Name: DA_AggressiveMelee
DesiredDistance: 300
DistanceTolerance: 0.15
CrowdTolerance: 0.6
bEnableStrafeRest: true
StrafeRestTimeLimit: 15.0
StrafeRestDuration: 0.5
bSwapStrafeOnHighThreat: false
bAdjustDistanceByThreat: false
ThreatDistanceScale: 1.0
PositioningRules: []Built-in Presets
FMovementBehaviorConfig factory methods fill the profile-level fields for common archetypes (applied in C++ via ApplyBehaviorConfig):FMovementBehaviorConfig::MakeDefault(); // Balanced (400 cm)
FMovementBehaviorConfig::MakeAttacker(); // Close, aggressive, minimal rest (300 cm)
FMovementBehaviorConfig::MakeWaiter(); // Far, patient, frequent rest (600 cm)
FMovementBehaviorConfig::MakeFlanker(); // Medium, quick repositioning (400 cm)
FMovementBehaviorConfig::MakeSupporter(); // Medium-far, moderate rest (500 cm)
FMovementBehaviorConfig::MakeElite(); // Relentless pressure, very short rest (350 cm)Positioning Rules are instanced UObjects. Inherit fromUPositioningRuleand overrideEvaluateDirection()for custom direction scoring. The built-inUAnglePreferenceRulecovers flanking, backstab, and frontal positioning.
DamageConfig
Used by: Melee Trace System
Contains damage values and type for melee attacks.
Full Structure
float Damage; // Base amount, before anything the target does to it (default 10)
FGameplayTag DamageType; // Kind of damage, for a target that resists or reacts by type
TSubclassOf<UDamageType> DamageTypeClass; // Carried on the point damage fallback; unset sends the engine default
FGameplayTagContainer DamageTags; // Extra tags describing hits from this attack, for example a backstab
bool bUseAuthoredHitDirection; // Send a fixed blow direction instead of the attacker-to-target one
FVector AuthoredHitDirectionLocal; // That direction in attacker space; (0,0,1) launches upward
TArray<TObjectPtr<USECHitEffect>> HitEffects; // What the hit does beyond the numberBlocking, parrying and critical hits are the target's business, not the config's. A target reports them back through
ResultTags on FSECDamageResult, which is what lets one attack read as parried by one enemy and armoured by another.Hit Effects
Details
SEC Damage Config (SECDamageConfig)
Damage
Damage
10
Damage Type
None
Damage Type Class
None
Damage Tags
0 tags
Multi Hit Interval
-1
Use Authored Hit Direction
Hit Effects
Hit Effects
0 Array elements
Data asset assigned on the montage notify or the trace component Default Damage Config.
Each entry runs itself when the hit lands. Two ship with the plugin:
| Effect | Does |
|---|---|
| SEC Play Gameplay Cues | Fires Attacker Cues on the attacker's ability system and Target Cues on the struck actor's. |
| SEC Apply Physics Impulse | Shoves the struck body: Hit Bone Force at the contact point, Hit Overall Force on the whole body, Hit Rotational Force to set it tumbling. Tick Velocity Change to make mass stop mattering. |
Subclass SEC Hit Effect in Blueprint for anything else. Every effect carries Suppress On Result Tags and Require Damage Applied, so a blocked hit can skip the screen shake while the blood still plays.
Usage
Assign per attack window on the SEC Melee Trace Window notify's Damage Config, or as the component's Default Damage Config for windows that name none. Run Hit Effects on SEC Damage Statics runs the same effect list when your own code applies the damage.