1. What must be ready before the blueprint
| What | Required |
|---|---|
| Skeleton | Yes |
| Animation and Blend Spaces | Required for animated control surfaces |
Creating the Skeleton, Skeletal Mesh, and animation assets is outside the scope of this documentation. It is assumed that you already have them and know how to work with them.
2. Create the Animation Blueprint
- Content Browser → Animation → Animation Blueprint.
- Parent Class →
BaseAircraftAnimInstance(derived from UBaseAircraftAnimInstance). Do not use AnimInstance. - Target Skeleton → your mesh skeleton.
- Name the asset using the ABP_<AircraftName> convention (e.g., ABP_MyPlane).
⚠️ The parent class is critical. The game only spawns a blueprint that derives from
.BaseAircraftAnimInstance
The blueprint goes into your mod content: Plugins/GameFeatures/<ModName>/Content/Blueprints/.
3. The AnimationInput inputs
BaseAircraftAnimInstance hands the graph the AnimationInput struct.
⚠️ This is flight model (FDM JSBSim) data, not what you pressed. The values are the real current positions of the control surfaces, taken from the model after its computation. The input command and the surface position are different things: deflect the elevator to the stop and the real value arrives gradually, at the speed set by the actuator in the JSBSim configuration files. The animation shows the physics, not the stick.
What follows from this:
- The range is a hard contract. Your Blend Space axis must match it: a wider axis clamps the pose at the extremes, a narrower one means you never see the full travel of the surface.
- The values update every frame and are already rate-limited by the model actuators. Do not add your own smoothing on top of them.
- Do not add a divisor or multiplier to the axis – the normalization is already done.
| Input | Type | Range | Meaning |
|---|---|---|---|
AnimationInput.Aileron.Left | float | -1..1 | ailerons; 0 is neutral, the sign is the deflection side |
AnimationInput.Aileron.Right | float | — | not used in the data flow: the right surface mirrors the left one |
AnimationInput.Elevator | float | -1..1 | elevator; 0 is neutral |
AnimationInput.Rudder | float | -1..1 | rudder; 0 is neutral |
AnimationInput.PitchTrim | float | -1..1 | pitch trim; 0 is neutral |
AnimationInput.Flaps | float | 0..1 | flaps; 0 retracted, 1 extended |
AnimationInput.Speedbrake | float | 0..1 | speedbrake; 0 closed, 1 open |
AnimationInput.Ramp | float | 0..1 | cargo ramp; 0 closed, 1 open |
AnimationInput.Gear | float | 0..1 | landing gear; 0 retracted, 1 deployed |
Ramp and gear are exceptions. Their values are not physical positions: they are final state values (0 or 1) received when the state changes. Smooth movement is entirely defined by your animation assets.
Engines are provided through a separate Get Engine State call. Index is the engine number, using the same order as the engines in the JSBSim configuration.
| Field | Type | Meaning |
|---|---|---|
Throttle | float | Current physical throttle value |
VFXThrottle | float | The throttle value exposed for VFX (remains 0 in ground mode) |
FinalRotation | Rotator | Final thrust vector rotation of the engine |
An out-of-range index returns an empty struct.
4. The example in the kit
Use ABP_ModExample as a reference for how AnimationInput and engine state are used in the AnimGraph.
Plugins/GameFeatures/ModExample/Content/Blueprints/ABP_ModExample
