INSODIMENSIONStudios
TargetingReference

Styles Reference

Complete reference for all targeting styles and their configuration options

Targeting Styles Reference

Complete reference for all targeting styles and their configuration options.

The 6 styles below are starter templates included with the plugin. Creating custom styles is simple - just create a Data Asset and configure properties. No C++ required. See Creating Custom Styles.


Quick Comparison

StyleLock TypeToggle BehaviorGrace PeriodBest For
SoulsHardTry different, release if none0.5sDark Souls, Elden Ring
GoWHardTry different, release if none0.7sGod of War (2018)
ZeldaHardCycle to next, keep if only one0.5sLegend of Zelda
FreeflowSoftStick direction priorityNoneCrowd combat
TwinStickSoftTimer-based auto-acquireNoneHELLDIVERS, twin-stick shooters
MultiLockMultiAdd target per press (BETA)0.3sMissiles, mark-and-execute

Hard Lock vs Soft Lock

Hard Lock (Souls, GoW, Zelda)

Player explicitly controls lock state:

  • Press input to lock
  • Press again to release or switch
  • Camera centers on target
  • UI shows clear lock indicator
  • Target persists until released or invalid

Soft Lock (Freeflow)

System manages target automatically:

  • Game code calls TriggerSoftLockUpdate() on attack
  • Target changes per-attack based on input direction
  • No persistent lock indicator
  • More fluid, cinematic combat

Souls Style

Tag: Agentic.Targeting.Style.Souls

Classic Dark Souls targeting. Toggle hard lock that stays on target until manually released or a different target is found.

Properties

PropertyValueDescription
LockCapacitySingleOne target at a time
SoftLockUpdatePolicyNoneNo soft lock updates
ValidationPolicyPoolOnlyValidate against target pool
ValidationTickInterval1.0sCheck validity every second
ValidationFailActionTrySwitchAuto-switch when target invalid
GracePeriod0.5sTime before validation fails
RelockActionTryDifferentToggle finds different target
RelockFallbackReleaseRelease if no other target
DefaultLockPresetTagMeleeUses melee preset by default
bAutoStartAwarenesstrueAuto-track peripheral threats

Behavior Flow

When Target Becomes Invalid

  1. Target dies, goes out of range, or loses LOS
  2. Grace period (0.5s) starts
  3. If still invalid after grace: ValidationFailAction = TrySwitch
  4. Find next best target and switch, or release if none

Code Example

// Set Souls style
TargetingComponent->SetStyleByTag(
    FGameplayTag::RequestGameplayTag("Agentic.Targeting.Style.Souls")
);

// Lock on (toggle)
TargetingComponent->Lock();

God of War Style

Tag: Agentic.Targeting.Style.GoW

Same as Souls but more forgiving. Longer grace period prevents frustrating lock breaks during high-mobility combat.

Properties

PropertyValueDifference from Souls
GracePeriod0.7s+0.2s more forgiving
All othersSameIdentical to Souls

When to Use

  • Fast-paced action with high mobility
  • Combat where targets frequently go behind cover
  • Games with aggressive enemy movement
  • Any situation where 0.5s grace feels too punishing

Code Example

TargetingComponent->SetStyleByTag(
    FGameplayTag::RequestGameplayTag("Agentic.Targeting.Style.GoW")
);

Zelda Style

Tag: Agentic.Targeting.Style.Zelda

Classic Z-targeting. Toggle cycles through targets instead of releasing, making it easy to manage multiple enemies.

Properties

PropertyValueDescription
RelockActionCycleToggle cycles to next target
RelockFallbackKeepStay on current if only one
All othersSame as Souls

Key Difference: Cycle vs TryDifferent

ScenarioSouls/GoWZelda
Toggle with 1 targetReleases lockStays locked
Toggle with 3 targetsFinds "different" (may skip)Cycles A->B->C->A
No targets in rangeReleasesReleases

Behavior Flow

Code Example

TargetingComponent->SetStyleByTag(
    FGameplayTag::RequestGameplayTag("Agentic.Targeting.Style.Zelda")
);

// First press: lock to target
TargetingComponent->Lock();

// Second press: cycle to next (not release!)
TargetingComponent->Lock();

Freeflow Style

Tag: Agentic.Targeting.Style.Freeflow

Arkham/Spider-Man style freeflow combat. Event-based soft lock that automatically targets based on attack direction.

Properties

PropertyValueDescription
LockCapacitySingleOne target at a time
SoftLockUpdatePolicyEventUpdate on gameplay events
SoftLockEventTagAttackListens for attack events
ValidationPolicyNoneNo timer-based validation
GracePeriod0Instant (soft lock handles it)
DefaultLockPresetTagFreeflowUses freeflow preset

Integration Required

Freeflow style requires your game code to trigger updates:

// In your attack system
void AMyCharacter::OnAttackStarted()
{
    // This triggers the soft lock to re-query and pick best target
    TargetingComponent->TriggerSoftLockUpdate();

    // Get the selected target for your attack
    AActor* Target = TargetingComponent->GetCurrentTarget();
    if (Target)
    {
        // Lunge toward target, play hit reaction, etc.
        PerformAttackOn(Target);
    }
}

Why No Validation?

Soft lock styles don't need validation timers because:

  1. Target is re-queried every attack
  2. Dead/invalid targets naturally filtered out
  3. Each attack picks the best current target

Code Example

TargetingComponent->SetStyleByTag(
    FGameplayTag::RequestGameplayTag("Agentic.Targeting.Style.Freeflow")
);

// Don't call Lock() directly - trigger from attacks
void OnPlayerAttack()
{
    TargetingComponent->TriggerSoftLockUpdate();
}

When to Use Freeflow vs TwinStick

StyleBest For
FreeflowAttack-driven targeting, crowd combat (Arkham, Spider-Man)
TwinStickContinuous auto-aim while aiming (twin-stick shooters)

TwinStick Style

Tag: Agentic.Targeting.Style.TwinStick

HELLDIVERS-style continuous auto-targeting. Timer-based soft lock that constantly evaluates and acquires the best target without player input.

Properties

PropertyValueDescription
LockCapacitySingleOne target at a time
SoftLockUpdatePolicyPoolOnlyUpdate on timer tick
SoftLockUpdateInterval0.1sRe-evaluate every 100ms
ValidationPolicyNoneNo timer-based validation
GracePeriod0Instant (continuous update handles it)
DefaultLockPresetTagMeleeUses melee preset by default

How It Works

Unlike Freeflow (event-based per attack), TwinStick continuously evaluates:

  1. Every 100ms, query for best target
  2. Automatically acquire/switch to best target
  3. Fires OnBecameTarget/OnLostTarget for UI updates
  4. No player input required - just aims at best target

When to Use

  • Twin-stick shooters - Geometry Wars, Enter the Gungeon
  • Top-down shooters - HELLDIVERS, Alien Swarm
  • Auto-aim systems - When player aims with stick, system picks target
  • Companion AI - NPCs that auto-target threats

Behavior Flow

Code Example

// Set TwinStick style
TargetingComponent->SetStyleByTag(
    FGameplayTag::RequestGameplayTag("Agentic.Targeting.Style.TwinStick")
);

// No Lock() calls needed - targeting runs automatically
// Just read the current target when needed:
AActor* Target = TargetingComponent->GetCurrentTarget();
if (Target)
{
    // Aim weapon, show indicator, etc.
}

TwinStick vs Freeflow

AspectTwinStickFreeflow
TriggerTimer (continuous)Event (per attack)
Question"Who am I aiming at now?""Who do I hit with this attack?"
Player inputNone neededAttack triggers update
Use caseShooters, auto-aimMelee brawlers

MultiLock Style (BETA)

Tag: Agentic.Targeting.Style.MultiLock

Lock onto multiple targets simultaneously. Each Lock() call adds the next best target until max capacity, then releases all. Perfect for missile systems, mark-and-execute, or cleave attacks.

BETA Feature: Multi-lock is functional but the API may change in future versions.

Properties

PropertyValueDescription
LockCapacityMultiMultiple targets simultaneously
MaxLockedTargets5Maximum targets (configurable 0-20)
SoftLockUpdatePolicyNoneNo soft lock (hard lock behavior)
ValidationPolicyPoolOnlyValidate all locked targets
ValidationTickInterval0.5sCheck validity every 500ms
ValidationFailActionReleaseRelease all if any fails
GracePeriod0.3sBrief grace before validation fails
RelockActionTryDifferentAdd different target each press

How It Works

  1. First Lock(): Locks onto best target
  2. Subsequent Lock(): Adds next best unlocked target
  3. At MaxLockedTargets: Next Lock() releases all

Behavior Flow

Multi-Lock API

// Get all locked targets
TArray<AActor*> Targets = TargetingComponent->GetLockedTargets();

// Check if specific target is locked
bool bLocked = TargetingComponent->HasLockedTarget(EnemyActor);

// Manually add/remove targets
TargetingComponent->AddLockedTarget(BossActor);
TargetingComponent->RemoveLockedTarget(DeadEnemy);

// Check capacity
bool bCanAdd = TargetingComponent->CanAddMoreLockedTargets();
int32 Count = TargetingComponent->GetLockedTargetCount();

Use Case: Multi-Lock Missiles

void AMyCharacter::FireMultiLockMissiles()
{
    TArray<AActor*> LockedTargets = TargetingComponent->GetLockedTargets();

    for (AActor* Target : LockedTargets)
    {
        SpawnHomingMissile(Target);
    }

    // Clear locks after firing
    TargetingComponent->ReleaseLock();
}

Use Case: Mark-and-Execute

void AMyCharacter::ExecuteMarkedTargets()
{
    TArray<AActor*> LockedTargets = TargetingComponent->GetLockedTargets();

    // Instant kill all marked targets (Splinter Cell style)
    for (AActor* Target : LockedTargets)
    {
        ApplyInstantKill(Target);
    }

    TargetingComponent->ReleaseLock();
}

Blueprint Setup

Same as single-lock styles - use Lock() button. Each press adds a target:

  1. Press 1: Lock target A
  2. Press 2: Lock target B (A stays locked)
  3. Press 3: Lock target C (A, B stay locked)
  4. Press 4: Lock target D
  5. Press 5: Lock target E (at max)
  6. Press 6: Release all (A-E unlocked)

Style Properties Reference

LockCapacity

ValueDescription
SingleOne target at a time (default)
MultiMultiple targets simultaneously (BETA)

SoftLockUpdatePolicy

ValueDescription
NoneNo soft lock (hard lock only)
EventUpdate on TriggerSoftLockUpdate()
TimerUpdate on interval (use with SoftLockUpdateInterval)

ValidationPolicy

ValueDescription
NoneNo validation (soft lock styles)
PoolOnlyValidate target is still in query pool
FullRun full validation preset

ValidationFailAction

ValueDescription
ReleaseImmediately release lock
TrySwitchTry to switch to another valid target
KeepKeep invalid target (for grace period)

RelockAction

ValueDescription
ReleasePressing lock while locked releases
TryDifferentFind a different target
CycleCycle to next target in pool

RelockFallback

ValueDescription
ReleaseRelease if RelockAction fails
KeepKeep current target

Switching Styles at Runtime

Change styles dynamically based on game state:

void AMyCharacter::OnCombatModeChanged(ECombatMode NewMode)
{
    switch (NewMode)
    {
    case ECombatMode::Melee:
        // Traditional lock-on for 1v1
        TargetingComponent->SetStyleByTag(
            FGameplayTag::RequestGameplayTag("Agentic.Targeting.Style.Souls"));
        TargetingComponent->SetPresetByTag(
            FGameplayTag::RequestGameplayTag("Agentic.Targeting.Preset.Melee"));
        break;

    case ECombatMode::Crowd:
        // Freeflow for group fights
        TargetingComponent->SetStyleByTag(
            FGameplayTag::RequestGameplayTag("Agentic.Targeting.Style.Freeflow"));
        TargetingComponent->SetPresetByTag(
            FGameplayTag::RequestGameplayTag("Agentic.Targeting.Preset.Freeflow"));
        break;

    case ECombatMode::Ranged:
        // Souls with ranged preset
        TargetingComponent->SetStyleByTag(
            FGameplayTag::RequestGameplayTag("Agentic.Targeting.Style.Souls"));
        TargetingComponent->SetPresetByTag(
            FGameplayTag::RequestGameplayTag("Agentic.Targeting.Preset.Ranged"));
        break;
    }
}

Creating Custom Styles

  1. Content Browser -> Right-click -> Miscellaneous -> Data Asset
  2. Pick Agentic Targeting Style

Pick Agentic Targeting Style

  1. Fill in the properties:
    • Style Tag - Unique tag for this style
    • Lock Capacity - Single or Multi
    • Validation Policy - How to validate locked target
    • Grace Period - Delay before lock breaks
    • Relock Action - What happens on toggle while locked

That's it. Your style is ready to use.

TargetingComponent->SetStyleByTag(
    FGameplayTag::RequestGameplayTag("Agentic.Targeting.Style.MyCustom")
);

For AI/External Tools: See AI JSON Workflow for bulk editing and AI-driven config generation.


Style + Preset Combinations

See Targeting Recipes for recommended Style + Preset combinations for common game scenarios.