Files
UE5-Modular-Game-Framework/docs/blueprints/03-interaction/21_BPC_ContextualTraversalSystem.md
Lefteris Notas eeb1bf82c9 feat: Enhance interaction and inventory systems with new components and functionality
- Added BPC_UsableWorldObjectSystem for handling various interactable world objects with detailed manual implementation guide.
- Introduced BPC_ActiveItemSystem to manage quick slots and active item usage, including cycling and selection logic.
- Implemented BPC_DocumentArchiveSystem for managing collectible documents with read tracking and categorization.
- Developed BPC_JournalSystem for narrative entries with auto-adding features based on gameplay events.
- Created BPC_KeyItemSystem for key management with consumable and persistent key support.
- Enhanced BPC_FirearmSystem for ranged weapon mechanics, including hitscan and projectile firing.
- Updated BPC_MeleeSystem for melee combat with combo and blocking mechanics.
- Established BPC_ReloadSystem for managing weapon reloading processes, including partial reloads and state management.
2026-05-19 18:37:42 +03:00

9.1 KiB
Raw Blame History

BPC_ContextualTraversalSystem — Contextual Traversal System

Parent Class: ActorComponent Category: Interaction Target UE Version: 5.55.7 Build Phase: 2 — Interaction


1. Overview

BPC_ContextualTraversalSystem handles player traversal of environmental obstacles — vaulting, climbing, squeezing through gaps, sliding under obstacles. Uses motion warping and root motion for smooth traversal animations triggered by context-aware detection.


2. Enums

E_TraversalType

Value Description
Vault Vault over low obstacles
Mantle Climb up onto ledges
Slide Slide under low barriers
Squeeze Squeeze through narrow gaps
LedgeGrab Grab and hang from ledges

E_TraversalHeight

Value Description
Low Below knee height (step up)
Medium Waist height (vault)
High Chest height (mantle)

3. Variables

Variable Type Description
DetectionRange float Max distance to detect traversable surfaces
DetectionHalfAngle float Cone angle for forward detection
VaultHeightThreshold float Max height for vault vs mantle decision
TraversalSpeed float Speed multiplier during traversal anim
bIsTraversing bool Currently playing traversal animation
CurrentTraversalType E_TraversalType Active traversal type
MotionWarpingTarget FVector Target location for motion warping
TraversalCooldown float Min time between traversals

4. Functions

Function Description
DetectTraversableObstacle Performs forward trace to detect vault/mantle points
AttemptTraversal Initiates traversal to detected point. Returns bool
ExecuteTraversal Plays traversal montage with motion warping
OnTraversalComplete Callback when montage finishes
CancelTraversal Interrupts traversal (damage/player input)
IsTraversing Returns bIsTraversing

5. Event Dispatchers

Dispatcher Payload Description
OnTraversalStarted E_TraversalType Type, FVector Target Traversal animation begins
OnTraversalComplete E_TraversalType Type Player reaches target position
OnTraversalFailed FText Reason Traversal attempt blocked

6. Dependencies & Communication

System Relationship
BPC_MovementStateSystem Movement mode override during traversal
BPC_CameraStateLayer Camera FOV adjustment during traversal
BPC_StressSystem Stress modifier for close-call traversals

7. Reuse Notes

  • Uses UE5 Motion Warping for accurate target placement
  • Detection uses capsule trace at player height ranges

8. Manual Implementation Guide

8.1 Class Setup

  1. Create Blueprint Class: Parent = ActorComponent, Name = BPC_ContextualTraversalSystem
  2. Add to Player Character
  3. Enable Motion Warping plugin in Project Settings

8.2 Variable Initialization (BeginPlay)

Event BeginPlay
  ├─ Set bIsTraversing = false
  ├─ Set DetectionRange = 200.0  (cm)
  ├─ Set DetectionHalfAngle = 45.0  (degrees)
  ├─ Set VaultHeightThreshold = 120.0  (waist height in cm)
  ├─ Set TraversalSpeed = 1.0
  ├─ Set TraversalCooldown = 0.5
  ├─ Get Owner → Get Component by Class (BPC_MovementStateSystem) → Cache reference
  ├─ Get Owner → Find Component by Class (BPC_CameraStateLayer) → Cache reference
  └─ Get Owner → Cast to Character → Get CharacterMovement → Cache CMC reference

8.3 Function Implementations

DetectTraversableObstacle()Hit Result, TraversalType, Height

[Function: DetectTraversableObstacle] (Pure)
  Step 1: Get Owner → Get Actor Location and Forward Vector
  Step 2: Three capsule traces at different heights:
    Trace A (Low: half-height = 30cm):
      Start: OwnerLocation + UpVector * 30
      End: Start + ForwardVector * DetectionRange
      Trace Channel: WorldStatic
    Trace B (Medium: half-height = 60cm):
      Same but offset by 60cm vertically
    Trace C (High: half-height = 90cm):
      Same but offset by 90cm vertically

  Step 3: For each trace that hits:
    Get Hit Actor → Get Hit Location → Get Hit Normal
    Calculate obstacle top: trace down from above obstacle to find top edge
    ObstacleHeight = topHit.Location.Z - bottomHit.Location.Z

  Step 4: Classify by height:
    ObstacleHeight <= 40cm → E_TraversalHeight::Low (step up)
    ObstacleHeight <= VaultHeightThreshold → E_TraversalHeight::Medium (vault)
    ObstacleHeight > VaultHeightThreshold → E_TraversalHeight::High (mantle)

  Step 5: Check clearance above obstacle (trace upward from top)
    If ceiling too low → cannot mantle → return invalid

  Step 6: Determine traversal type:
    - Low + no obstacle: just step (automatic)
    - Medium + clearance: Vault
    - High + ledge: Mantle
    - Narrow gap (sides): Squeeze
    - Low barrier with gap: Slide

  Step 7: Calculate landing position:
    Forward trace from obstacle top to find landing spot
    Set MotionWarpingTarget = landingPosition

  Step 8: Return HitResult, TraversalType, TraversalHeight struct

Nodes: Line Trace by Channel (x5+), Break Hit Result, Get Hit Location, Get Hit Normal, Vector Up/Down/Forward, Make Vector, Branch, Switch on E_TraversalHeight

AttemptTraversal(TraversalType, TargetLocation)Boolean

[Function: AttemptTraversal]
  Step 1: Branch on bIsTraversing → If true, return false
  Step 2: Branch on CooldownActive → If cooldown timer active, return false
  Step 3: Query BPC_StateManager → IsActionPermitted("Action.Traverse")
    False → Fire OnTraversalFailed("Blocked by state"), return false

  Step 4: Set bIsTraversing = true
  Step 5: Set CurrentTraversalType = TraversalType
  Step 6: Notify BPC_MovementStateSystem → SetMovementMode(Vaulting, Forced)
  Step 7: Disable player input (optional — depends on traversal type)
  Step 8: Fire OnTraversalStarted(TraversalType, TargetLocation)

  Step 9: Call ExecuteTraversal(TraversalType, TargetLocation)
  Step 10: Return true

ExecuteTraversal(Type, Target)void

[Function: ExecuteTraversal]
  Step 1: Switch on Type:
    Case Vault:
      - Play Montage: AM_Vault (from Animation Blueprint)
      - Add Motion Warping Target: "VaultTarget" → Target location
      - Root motion in montage moves character to Target
    Case Mantle:
      - Play Montage: AM_Mantle
      - Add Motion Warping Target: "MantleTop" → ledge top
      - Add Motion Warping Target: "MantleLand" → landing position
    Case Slide:
      - Play Montage: AM_Slide
      - Set capsule half-height to crouch height temporarily
      - Add Motion Warping Target: "SlideTarget"
    Case Squeeze:
      - Play Montage: AM_Squeeze
      - Add Motion Warping Target: "SqueezeTarget"
    Case LedgeGrab:
      - Play Montage: AM_LedgeGrab
      - Disable gravity temporarily
      - Attach to ledge point

  Step 2: On Montage Completed or Blending Out:
    Call OnTraversalComplete()

Nodes: Play Montage, Add or Update Motion Warping Target (name + location), Set Capsule Half Height, On Completed delegate

OnTraversalComplete()void

[Function: OnTraversalComplete]
  Step 1: Set bIsTraversing = false
  Step 2: Restore capsule half-height (if modified)
  Step 3: Re-enable player input (if disabled)
  Step 4: Notify BPC_MovementStateSystem → restore previous movement mode
  Step 5: Start TraversalCooldown timer → set bCanTraverse = false
    On timer end → bCanTraverse = true
  Step 6: Fire OnTraversalComplete(CurrentTraversalType)

CancelTraversal()void

[Function: CancelTraversal]
  Step 1: Branch on bIsTraversing → If false, return
  Step 2: Stop Montage (AM currently playing)
  Step 3: Set bIsTraversing = false
  Step 4: Restore movement mode, input, capsule height
  Step 5: Fire OnTraversalFailed("Cancelled")

8.4 Event Dispatcher Bindings

Bind to Dispatcher Custom Event Logic
IA_Jump (Pressed near obstacle) OnTraversalInput Call DetectTraversableObstacle → if valid: AttemptTraversal
BPC_MovementStateSystem.OnMovementModeChanged CheckTraversalState If in Vaulting mode and bIsTraversing false → force cancel

8.5 Blueprint Build Checklist

  • Enable Motion Warping plugin
  • Create BPC_ContextualTraversalSystem, add to Player Character
  • Add all variables with defaults
  • Create traversal montages: AM_Vault, AM_Mantle, AM_Slide, AM_Squeeze, AM_LedgeGrab
  • Add Motion Warping notifies in montages at key frames
  • Implement DetectTraversableObstacle with multi-height capsule traces
  • Implement AttemptTraversal with state/cooldown checks
  • Implement ExecuteTraversal with type-switch and motion warping targets
  • Implement OnTraversalComplete cleanup
  • Bind IA_Jump for traversal input
  • Test: vault over low wall, mantle onto ledge, slide under barrier