- Updated BPC_NarrativeStateSystem with a comprehensive manual implementation guide, including class setup, variable initialization, and function breakdowns. - Expanded BPC_ObjectiveSystem documentation to include a manual implementation guide and detailed function descriptions. - Added a manual implementation guide for BPC_DialoguePlaybackSystem, outlining class setup and function nodes. - Introduced a manual implementation guide for BPC_DialogueChoiceSystem, detailing choice presentation and selection processes. - Enhanced BPC_BranchingConsequenceSystem documentation with a manual implementation guide for consequence evaluation. - Updated BPC_TrialScenarioSystem with a manual implementation guide for scenario management. - Expanded BPC_LoreUnlockSystem documentation to include a manual implementation guide for lore entry management. - Added a manual implementation guide for BP_NarrativeTriggerVolume, detailing trigger volume setup and action execution. - Enhanced BPC_EndingAccumulator documentation with a manual implementation guide for ending evaluation. - Updated BPC_HitReactionSystem with a manual implementation guide for hit reaction management. - Added a manual implementation guide for BPC_RecoilSystem, detailing recoil application and recovery processes. - Introduced DT_ProjectTags.csv to define gameplay tags for various systems, enhancing data-driven design capabilities.
3.8 KiB
3.8 KiB
BPC_RecoilSystem — Actor Component
File: Content/Framework/Weapons/BPC_RecoilSystem
Parent Class: UActorComponent
Dependencies: DA_WeaponData, BPC_FirearmSystem, BPC_CameraStateLayer
Purpose: Handles procedural recoil: camera kick, recovery curve, and ADS recoil reduction. Works with BPC_FirearmSystem to apply per-weapon recoil patterns.
Variables
| Name | Type | Description |
|---|---|---|
RecoilPattern |
CurveVector | Per-weapon kick pattern (X=pitch, Y=yaw) |
RecoverySpeed |
Float | How fast camera returns to rest |
ADSRecoilMultiplier |
Float | Recoil reduction while aiming (0.3-0.7) |
CurrentRecoilOffset |
Vector2D | Accumulated recoil offset |
bIsRecovering |
Bool | Recovery in progress |
Functions / Events
| Name | Inputs | Outputs | What it does |
|---|---|---|---|
ApplyRecoil |
ShotCount: Integer, bADS: Bool | — | Applies recoil kick based on weapon pattern |
ResetRecoil |
— | — | Clears accumulated offset |
TickRecovery |
DeltaTime: Float | — | Lerps CurrentRecoilOffset back toward zero |
SetRecoilPattern |
Pattern: CurveVector | — | Loads per-weapon recoil data from DA_WeaponData |
Blueprint Flow
[FirearmSystem fires] -> ApplyRecoil(shotCount, bADS)
-> Look up RecoilPattern value at shotCount index
-> Apply ADSRecoilMultiplier if bADS
-> Add to CurrentRecoilOffset
-> Push offset to BPC_CameraStateLayer
-> Start recovery timer on tick
Communications With
| Target System | Method | Why |
|---|---|---|
BPC_FirearmSystem |
Direct call from ApplyRecoilRequest | Receives fire events |
BPC_CameraStateLayer |
Direct ApplyFOVModifier | Camera kick application |
Reuse Notes
- RecoilPattern is a CurveVector from DA_WeaponData — swap per weapon
- For hitscan weapons, call ApplyRecoil on every shot. For projectile, call on fire release
- Recovery runs on tick when bIsRecovering; disable tick at rest for performance
Manual Implementation Guide
Class Setup
- Create Blueprint Class: Parent =
ActorComponent, Name =BPC_RecoilSystem - Attach to
BP_RangedWeaponor Player Character - ⚠️ Local only — recoil is cosmetic, not replicated
Variable Init (BeginPlay)
Event BeginPlay
├─ Set CurrentRecoilOffset = (0, 0)
├─ Set bIsRecovering = false
├─ Read RecoilPattern from DA_WeaponData
└─ Cache: BPC_CameraStateLayer (from Player)
Function Node-by-Node
ApplyRecoil(ShotCount: Integer, bADS: Boolean) → void
Step 1: Sample RecoilPattern curve at ShotCount (or accumulated counter)
Step 2: Get curve output: Pitch = X channel, Yaw = Y channel
Step 3: If bADS: Pitch *= ADSRecoilMultiplier, Yaw *= ADSRecoilMultiplier
Step 4: CurrentRecoilOffset.X += Pitch, CurrentRecoilOffset.Y += Yaw
Step 5: Push to camera:
BPC_CameraStateLayer.AddControllerPitch(Pitch) ← or PlayCameraShake
BPC_CameraStateLayer.AddControllerYaw(Yaw)
Step 6: Set bIsRecovering = true
Step 7: Set Timer (0.05s loop) → TickRecovery ← timer runs while recovering
TickRecovery(DeltaTime: Float) → void
Step 1: CurrentRecoilOffset = Lerp(CurrentRecoilOffset, Vector2D(0,0), RecoverySpeed * DeltaTime)
Step 2: If CurrentRecoilOffset nearly zero (< 0.01):
ResetRecoil()
Clear Recovery timer
Build Checklist
- Create BPC_RecoilSystem, attach to Player
- Create RecoilPattern CurveVector per weapon (X=pitch, Y=yaw)
- Implement ApplyRecoil with curve sampling + ADS multiplier
- Implement TickRecovery with lerp toward zero
- Wire to BPC_FirearmSystem.OnFire
- Test: fire weapon → camera kicks up → recovers to center