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:
  1. Pawn implementing IEnemyAIConfigProvider
  2. SECCombatControllerComponent's DefaultAIConfig, 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
PropertyPurpose
Default AI ConfigFallback AI Config when the pawn provides none
Auto Register For Combat RolesRegister with the role subsystem on possession
Enable Threat DetectionTurn on ThreatDetectionComponent at BeginPlay
Drop Weapon On DeathDrop the equipped weapon with physics on death. Untick to handle the drop yourself, from an AnimNotify or K2_OnDeath.
Auto Handle Death On Health DepletedRun HandleDeath() when the health vital empties

SECCombatControllerComponent Delegates

DelegatePurpose
OnCombatRoleChangedBroadcast when combat role changes (new role, old role)
OnCombatTargetLostBroadcast when assigned combat target is destroyed/unregistered
OnCombatRoleSystemReadyBroadcast after successful registration with the role subsystem. Safe to call ForceAssignRole here.
OnDeathBroadcast 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 off

Decision 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)DefaultPurpose
AggressionLevel1.0Baseline aggression written into the decision context. 0 = defensive, 1 = balanced, 2 = aggressive. Clamped 0-2.
WindowIdIntervalSeconds1.0Seconds between window increments that reseed score variation. 0 = never advance.
LineOfSightTraceChannel ("LOS Trace Channel")VisibilityCollision channel for the line-of-sight trace. Point it at a dedicated visibility channel if the project has one.
bLineOfSightTraceComplex ("LOS Trace Complex")falseTrace 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). FSECDecisionContextParams holds 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 commits
A single action can replace the global window. On its FActionSpec Recovery group, set bOverrideRecoveryTime and RecoveryTime (absolute, not additive). Completion uses the override if set; interrupt or cancel always uses InterruptRecoveryTime; a timeout always uses the global ActionRecoveryTime.

ActionSet

Used by: Action System
Contains an array of FActionSpec, which are all available actions for an AI.

Creating an ActionSet

  1. Right-click → Miscellaneous → Data Asset → ActionSet
  2. Add actions to the Actions array
  3. 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 on FActionSpec. They are opt-in entries in the CustomScoring list. 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)PropertyDefaultReadsNotes
Distance ScorerRange (FRangeEval)MakeMeleeRange()AI-to-target distance (cm), 0 with no targetRange OptimalMin/Max also feed the positioning query (GetIdealDistanceForAction)
Angle ScorerRange (FRangeEval)MakeFrontalAngle()Absolute angle to target (deg), 0 facing it, 0 with no target
Health ScorerRange (FRangeEval)MakeAlwaysOne()AI health 0-1, sourced from the pawn's health vitalFor any other pool use Vital Scorer; for a GAS health attribute use an Attribute Scorer
Speed ScorerRange (FRangeEval)MakeAlwaysOne()AI horizontal speed (cm/s)
Vital ScorerVitalTag, bUseFraction, Range (FRangeEval)true / MakeAlwaysOne()Any named vital, as a fraction or raw valueThe general form behind Health Scorer; no effect on a pawn without the vital
Stamina GateMinStamina0Decision-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 GateVitalTag, MinValue, bUseFraction0 / falseAny named vital, as a fraction or raw valueThe general form behind Stamina Gate; no effect on a pawn without the vital
Attribute ScorerAttribute, NormalizeBy, ValueEval (FRangeEval)n/aA GameplayAttribute on the owning ASCOptionally divide by NormalizeBy (e.g. Mana / MaxMana) before scoring
Attribute GateAttribute, MinValue, MaxValue0 / 0A GameplayAttribute on the owning ASCPass 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 old DistanceEval becomes a Distance Scorer and AngleEval an Angle Scorer; a non-default Health or Speed range becomes a Health or Speed Scorer; a StaminaCost above 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

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 default

Example 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 from UPositioningRule and override EvaluateDirection() for custom direction scoring. The built-in UAnglePreferenceRule covers flanking, backstab, and frontal positioning.

DamageConfig

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 number
Blocking, 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:
EffectDoes
SEC Play Gameplay CuesFires Attacker Cues on the attacker's ability system and Target Cues on the struck actor's.
SEC Apply Physics ImpulseShoves 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.