Getting Started with SoulslikeCombat

Documentation Unreal Engine AI Tutorial

Turn the plugin on and get a live enemy that spots the player, closes the distance and holds its range, with no C++.


One pawn Blueprint, one data asset, two fields filled in, and you have an enemy that notices the player and comes for them.

See a finished enemy first

Turn on Show Plugin Content in the Content Browser's settings menu, then open Showcase/Maps/LVL_SEC_Showcase in plugin content and press Play. It ships with a player, a navmesh, and armed enemies to fight.
The pieces worth reading are under Showcase/Characters/SECEnemy:
AssetWhat it is
BP_SEC_EnemyCharacterThe enemy pawn
BP_SEC_EnemyControllerIts AI controller
EnemyConfig_DefaultIts AI config: per-role action sets and movement profiles, an awareness config, an awareness-filtered target selector, and StateTree_SEC_Core as its brain
Copy them into your own content and edit from there, or build fresh with the recipe below.

Set it up

2 minutes
  1. 1

    Turn the plugin on

    Get Soulslike Enemy Combat on Fab, open the Epic Games Launcher, and click Install to Engine for 5.6, 5.7 or 5.8.
    In your project, open Edit > Plugins, search Soulslike Enemy Combat, tick it, and restart when prompted. It switches on what it needs alongside it: Gameplay Abilities, State Tree, Gameplay State Tree, Motion Warping, Animation Warping and Enhanced Input.
  2. 2

    Make the enemy Blueprint

    Right-click in the Content Browser, Blueprint Class, and search for Enemy Character Base. Name it BP_MyEnemy.
    Open it, assign your skeletal mesh and its Anim Class, then open Class Defaults and set AI Controller Class to Enemy Controller Base.
    BP_MyEnemy
    Pawn
    AI Controller ClassAIController
    The pawn is the body. That controller is the brain, and it ships carrying every component the AI needs.
  3. 3

    Create an Enemy AI Config

    Right-click in the Content Browser, SEC, Enemy AI Config. Name it DA_AIConfig_Grunt.
    Content Browser
    Content
    Right-click in the Content Browser, SEC, Enemy AI Config.
  4. 4

    Fill in the two fields that ship empty

    Open the config. Under Combat Role, set Target Selector to Awareness Filtered Target Selector, and leave its Inner Selector empty so it picks the nearest candidate. Under Awareness, set Awareness Config to a new asset from the same SEC menu, and leave that asset's defaults alone.
    DA_AIConfig_Grunt
    Details
    Target SelectorNone
    Awareness Config
    None
    Both ship empty, and an enemy missing either one stands still with nothing in the log.
    The two work as a pair: the awareness config is what does the perceiving, and the filter offers the enemy only targets it has perceived. Fill in the config alone and the enemy senses a target, then engages any hostile in the pool. Set the filter alone and it perceives nothing, so it fights nothing.
    The awareness defaults are a working guard: 1500 cm of sight across a 180 degree cone, 1200 cm of hearing, and a damage sense that reveals whoever hits it from behind.
  5. 5

    Point the pawn at the config, and play

    Back in BP_MyEnemy, under Class Defaults > AI, set AI Config to DA_AIConfig_Grunt.
    BP_MyEnemy
    AI
    AI Config
    None
    The controller reads this the moment it possesses the pawn, so one controller class serves every enemy type.
    Drag the enemy into a level that has a NavMesh Bounds Volume, press Play, and run SEC.Debug.Awareness 1 in the console. Walk into its cone. The line above its head climbs to Detected, and the enemy closes to 400 cm and starts circling.
Set AI Controller Class to Enemy Controller Base in the pawn's Class Defaults. Enemy Character Base ships without one. A pawn still carrying the project default gets a controller that holds none of the combat components, so nothing on the AI Config reaches the enemy and the log stays quiet about it.

Give it something to hit you with

The enemy from the QuickStart chases and holds its range. Attacks are one more data asset.
  1. Create an Action Set and add an action to its canvas.
  2. Set the action's Ability Class to GA_SEC_MontageAbility, which ships with the plugin, then set the Montage on the payload underneath.
  3. Add a Distance Scorer so the action knows what range it works at.
  4. Set Default Action Set on the AI Config to that asset.
The Action System walks it through with screens. For the swing to deal damage, the montage also needs a trace window: see Melee Trace.

What the pieces are

PieceMade fromHolds
Enemy pawnBlueprint from Enemy Character BaseThe body: mesh, ability system, health, melee trace, defense, equipment, team and territory
AI controllerBlueprint from Enemy Controller BaseThe decisions: movement, action scoring, reactions, awareness, threat, and the brain that ticks them
Enemy AI ConfigData asset under SECWhich sets and profiles this enemy uses, how it picks targets, what it can sense
Action Set, Reaction Set, Movement Behavior ProfileData assets under SECThe moveset, the defensive answers, and the footwork
Everything the AI decides runs on the server. The pawn replicates the results, so a client's UI can read an enemy's role, action and health without any of the decision-making crossing the wire. See Multiplayer.

What goes on the config

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
Each Default covers every combat role, so one entry per category is enough to start. The Role arrays override it per role: an aggressive moveset for Attacker, a patient one for Waiter. The three Manage Automatically switches are ticked out of the box; untick one to drive that category from Blueprint instead.
The pawn's own health lives on its Vitals component, which ships one Health row at 100. See Vitals.
Leave Default State Tree empty on the config and the enemy runs the plugin's built-in brain: build context, move, then pick and run the best action on a 0.1 second cadence. Nothing needs authoring for that. Point it at a StateTree to take the sequencing over yourself.

Where to go next

You wantRead
A moveset that picks the right attackAction System
To wire that moveset on a canvasAction Set Editor
Circling, spacing and backing offMovement System
Parries, flinches and countersReaction System
Attacks that deal damageMelee Trace
Stealth, patrols and investigating a noiseAwareness System
Several enemies taking turns instead of swarmingCombat Roles and Combat Tokens
Who each enemy fightsTargeting System
A weapon that carries its own movesetWeapons
Guards that hold a post and give up the chaseTerritory
A full armed enemy, start to finishStep-by-Step Enemy

Debug it

Every overlay draws above the enemy's head in Play In Editor.
SEC.Debug.All 1          // Every overlay at once; SEC.Debug.All 0 clears them
SEC.Debug.Awareness 1    // What each enemy has noticed, and how sure it is
SEC.Debug.Role 1         // Name and combat role, coloured by role
SEC.Debug.Decision 1     // Distance, angle, line of sight, speed, threat
SEC.Debug.Movement 1     // Movement layer, strafe side and heading
SEC.Debug.Scoring 1      // What each action scored, highest first
SEC.Debug.WatchPawn <name> narrows every overlay to one enemy, part of a name being enough, and SEC.Debug.WatchClear puts them all back. SEC.Debug.MaxDistance sets how far from the camera a block still draws (4000 cm) and SEC.Debug.TextScale sizes the text.
AdvancedThe enemy stands there and does nothing
In the order worth checking:
  • AI Controller Class is unset on the pawn Blueprint, so the pawn got the project's default controller and none of the combat components exist.
  • Target Selector is empty on the AI Config, and the project's Default Target Selector ships empty too. The fallback still hands the enemy the first target it may fight, so check this when the enemy engages the wrong one rather than when it engages nothing.
  • Awareness Config is empty, so the enemy senses nothing, stays at Unknown, and never enters its combat phase.
  • No navmesh. Past 800 cm the enemy asks for a path, and the request fails every tick. Add a NavMesh Bounds Volume, build navigation, and press P to check it covers the floor.
  • The AI Config is on neither the pawn nor the controller, so there is nothing to resolve at possession.
SEC.Debug.Role 1 reads None for an enemy that never took a target, which separates the first three from the rest. Troubleshooting covers the longer list.
AlternativeUse a character Blueprint you already have
Reparent it rather than rebuilding it.
  1. Open your character Blueprint.
  2. File > Reparent Blueprint, then pick Enemy Character Base.
  3. Your existing components, variables and graphs stay. You inherit the ability system, the combat components, the damage interfaces and the dedicated-server socket fix.
  4. Delete any duplicate the Blueprint added itself, such as its own ability system component, so only the inherited ones remain.
  5. Set AI Config and AI Controller Class in Class Defaults, then carry on as normal.
Reparenting also initialises the ability system for you, which is the part a Blueprint cannot do on its own. An ability whose ability system never got that call refuses to activate and says nothing about why.
A character that has to inherit from a different C++ base can still work: it needs the same components, an initialised ability system, and the AI config interface implemented. The API Reference lists what to reproduce.
AlternativeUse an AI controller you already have
File > Reparent Blueprint to Enemy Controller Base, the same as the pawn.
Adding the components to a bare AI controller is not equivalent. The base class holds the AI's facing during an attack and turns it toward a target's last-known location, and attack abilities rely on that. A plain controller keeps tracking the target mid-swing and loses that facing logic.
AlternativeStart the fight the moment the level loads
Skip stealth for an arena or a boss room.
Tick Always Aware on the Awareness Config. The enemy then knows about every hostile target from the start, without needing to see or hear one, and never forgets. Sight, hearing and the escalation meter are bypassed while it is on.
A target still has to exist in the shared pool for that to bite. Register the player once, on the player pawn's Event BeginPlay: add Get AICombat Role Subsystem, then call Register Combat Target with Target Actor set to Self and Auto Assign Unassigned ticked. Branch on Has Authority first, since AI decisions run on the server.
Player pawn · Event BeginPlay
AICombatRoleSubsystem
Register Combat Target
Target is AICombat Role Subsystem
Target
Target ActorSelf
Auto Assign Unassigned
Reevaluate Existing
With awareness doing the work instead, that node is optional: an enemy that reaches Detected on its own adds that target to the pool, so the rest of the pack can be assigned to it too. See Targeting.
AlternativeRun a StateTree instead of the built-in brain
Set Default State Tree on the AI Config to take over the sequencing: patrol, investigate, engage, retreat, phase transitions. StateTree_SEC_Core under Showcase/AI/StateTree is a working graph to start from or copy.
The evaluation components stay the same either way. The graph decides when to poll and when to act; the components still do the scoring and the steering. See StateTree Integration.
AdvancedWhich engine versions, and what ships in the box
Version 3.0.0 runs on Unreal Engine 5.6, 5.7 and 5.8, in single player and in multiplayer on a listen or dedicated server.
The plugin ships three runtime modules and an editor module. Its content sits in two folders: Core holds the pieces a shipping game reaches for (the montage ability, the reaction ability, the damage types, the default impact surfaces), and Showcase holds the demo level, its player, its enemies and their data assets.