person-rifleFirst Person Base Character AnimBP (ABP_TFA_FP_BaseCharacter)

Core AnimBP for first-person character animation state, IK, procedural offsets, and grip blending.

Asset path: /Game/InfimaGames/TacticalFPSAnimations/Common/Core/Characters/ABP_TFA_FP_BaseCharacter

ABP_TFA_FP_BaseCharacter is the main first-person animation hub for the pack. It reads gameplay state from Base Character (BP_TFA_BaseCharacter), applies ADS, recoil, and crouch offsets, and drives the grip and IK behavior used by the notify-state system.


Quick Navigation



Dependencies


This AnimBP expects three things:

  • The owning pawn is BP_TFA_BaseCharacter or a child class

  • The AnimBP implements BPI_TFA_AnimationState

  • The skeleton includes the IK chain bones used by FABRIK:

  • ik_hand_r, hand_r, clavicle_r

  • ik_hand_l, hand_l, clavicle_l

If one is missing, the AnimBP can still evaluate, but you will lose features. The clearest symptoms are floaty hands and grip blending that appears to do nothing.


Variables Exposed by This AnimBP


References

  • CharacterBP (BP_TFA_BaseCharacter)

    • Cached owner reference set during initialization

State Pulled from CharacterBP

  • bIsRunning

  • bIsWalking

  • bIsSprinting

  • bIsAiming

  • bAnimateCamera

  • Stance (E_TFA_Stance)

  • CurrentGrip (E_TFA_GripAttachment)

Animation Data Pulled from CharacterBP

  • AimDownSightsTransform

  • RecoilTransform

  • CrouchTransform

Grip State Driven by Notify States

  • bIsLeftHandOnWeapon

  • CurrentGripAlpha

  • GripBlendSpeed

  • GripPoseBlendSpeed

The AnimGraph uses these values to drive grip overlays, procedural offsets, and hand pinning.


Initialization


On BlueprintInitializeAnimation, the AnimBP calls TryGetPawnOwner, casts the owner to BP_TFA_BaseCharacter, and stores the result in CharacterBP. If the owning pawn is not a BP_TFA_BaseCharacter, all of the pull-from-character logic stays idle.


Per-Frame Update Flow


On BlueprintUpdateAnimation, the AnimBP validates CharacterBP, builds InputMoveVector from CharacterBP.SimulatedVelocity.XY, copies the relevant state booleans and procedural transforms, copies CurrentGrip, and then calls Interpolate Grip Alpha.

InputMoveVector exists because the demo simulates movement instead of physically moving the capsule. The character handles that in SimulateVelocity, and this AnimBP reads the resulting 2D motion input.


Unlock Actions Notify Hook


This AnimBP implements AnimNotify_AN_UnlockActions. When that notify fires, it clears the busy flag on the character by setting CharacterBP.bIsBusy = false.

That notify is emitted by Unlock Actions (AN_TFA_UnlockActions).


Left Hand Grip Flow


The pack’s Left Hand Grip (ANS_TFA_LeftHandGrip) notify state calls BPI_TFA_AnimationState.UpdateLeftHandGrip(bool IsLeftHandOnWeapon, float BlendSpeed). This AnimBP stores IsLeftHandOnWeapon in bIsLeftHandOnWeapon and stores the incoming BlendSpeed in GripBlendSpeed.

GripPoseBlendSpeed is separate tuning for pose swaps when CurrentGrip changes. If your graph never reads it, it is effectively unused.

Interpolate Grip Alpha

Every frame, the AnimBP interpolates CurrentGripAlpha toward 1.0 or 0.0 based on bIsLeftHandOnWeapon, using GripBlendSpeed with FInterpTo and GetWorldDeltaSeconds. The notify state sets the target and speed. The AnimBP performs the smoothing.


AnimGraph Overview


Locomotion Base Pose

The locomotion layer is the base pose. It is driven by InputMoveVector, movement flags, and Stance, which lets the pack preview movement without moving the capsule.

Main inputs:

  • InputMoveVector from SimulatedVelocity.X and SimulatedVelocity.Y

  • bIsWalking, bIsRunning, bIsSprinting

  • Stance

If you replace the locomotion assets, keep the same input convention. Treat zero input as idle, and keep X and Y as forward and strafe.

circle-info

If you switch to real movement, use actual velocity instead of the simulated value, but keep it as a 2D vector so the blend spaces continue to behave correctly.

Mesh-Space Additive Stack

The first-person feel comes from additive layers placed on top of locomotion. This pack expects those layers to be mesh-space additive so the motion stays stable. Typical content here includes recoil, ADS offsets, subtle sway, stance overlays, and grip overlays tied to CurrentGrip.

Typical Evaluation Order

This AnimBP follows a familiar order:

  1. Build the locomotion base pose

  2. Apply mesh-space additive layers for ADS, recoil, and crouch

  3. Run hand IK to pin the hands to the weapon

  4. Optionally blend camera or head motion

That order keeps the hands stable during ADS and recoil.

Cached Poses

The graph caches the base pose and reuses it downstream with UseCachedPose. That avoids duplicate evaluation. If you refactor the graph, keep the cached pose close to the locomotion output and reuse it for both additive layers and IK.

Mesh-Space Additive Setup Checklist

When you import or author new additive sequences, use:

  • Additive type: Mesh Space

  • Base pose: Reference Pose, or the same base pose used by the pack

  • Root motion: usually disabled for additive clips

If those settings are wrong, you can get double transforms, arm twisting during recoil, or ADS offsets sliding in the wrong direction.

circle-exclamation

Hand IK with FABRIK

The AnimGraph converts to component space and runs FABRIK on both arms to pin the hands to weapon IK targets. That is what keeps the hands stable once additive layers start stacking.

Both FABRIK nodes expose LODThreshold, which is useful if you want to disable IK at distant LODs and trim CPU cost.

Camera and Head Animation Toggle

The graph uses a LayeredBoneBlend on the head branch, with bAnimateCamera controlling the blend weight. In this AnimBP, the blend pose is the reference pose, so the toggle overrides head motion with a stable reference pose.

  • Weight 0 keeps head motion from the base pose

  • Weight 1 forces the head branch to the reference pose

This is mostly demo-friendly behavior, and it is a simple way to remove camera or head motion without rewriting the base pose.

Procedural Offsets

The graph consumes character-driven transforms for ADS through AimDownSightsTransform, recoil through RecoilTransform, and crouch through CrouchTransform. The AnimBP does not generate these values. It applies them as part of the additive stack, and they should stay before IK.

Grip Overlays

The grip system has two parts:

  • CurrentGrip selects which grip pose to use

  • CurrentGripAlpha controls how much of that grip overlay is visible

ANS_TFA_LeftHandGrip drives the alpha window, while CurrentGrip usually comes from weapon or config state on the character. That lets the graph keep the correct grip pose selected and smoothly fade the left-hand overlay in or out during reloads or interactions.


Integration Checklist


If grip behavior or additive layers look inactive, check these first:

  • The mesh uses ABP_TFA_FP_BaseCharacter as its Anim Class

  • The AnimBP implements BPI_TFA_AnimationState

  • The montages include ANS_TFA_LeftHandGrip windows where needed

  • BP_TFA_BaseCharacter is updating:

    • SimulatedVelocity

    • ADS, recoil, and crouch transforms

    • CurrentGrip


Troubleshooting


CharacterBP Is None

  • Confirm the mesh using this AnimBP belongs to BP_TFA_BaseCharacter

  • Confirm the mesh actually uses ABP_TFA_FP_BaseCharacter as its Anim Class

Grip Blending Does Nothing

  • Confirm this AnimBP implements BPI_TFA_AnimationState

  • Confirm your montages include ANS_TFA_LeftHandGrip

  • Confirm GripBlendSpeed is not 0

IK Looks Broken

  • Confirm the skeleton has the required IK bones

  • Confirm the weapon sets up IK targets on the intended bones or sockets



Last updated

Was this helpful?