- 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.
9.1 KiB
9.1 KiB
BPC_ContextualTraversalSystem — Contextual Traversal System
Parent Class: ActorComponent
Category: Interaction
Target UE Version: 5.5–5.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
- Create Blueprint Class: Parent =
ActorComponent, Name =BPC_ContextualTraversalSystem - Add to Player Character
- Enable
Motion Warpingplugin 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