Time Remaining, Relevant Anim Time Remaining, and Automatic Rules¶
At a glance
Lives in: an Animation Blueprint transition rule; the named asset-player
getters are generated from players in that AnimGraph, while the relevant
getters are generated for the transition's source state · Returns:
float animation time, either seconds or a 0..1-style fraction ·
Success pin: none; an unusable player still produces a number, not
None or a Boolean · Changes anything: no; these getters only read the
current animation update · Automatic Rule: a transition setting, not a
getter node; it replaces the transition graph's Boolean timing test ·
Official pages: Transition Rules,
UAnimInstance,
and Get Relevant Anim Time Remaining
These names all sound like “is my state finished?” They do not report state completion. They read one asset player's playback position and help a transition decide when to start blending away from the source state.
The one-minute version¶
- Time Remaining is tied to one particular Sequence Player, Blend Space Player, or other asset-player node chosen when the Animation Blueprint compiles. Use it when that exact player owns the timing.
- Time Remaining (ratio) reads that same named player but normalizes its
remaining portion: roughly
1near the beginning and0near the end. - Get Relevant Anim Time Remaining asks the source state for its currently most relevant eligible asset player. Use it when blending decides which of several players currently matters most.
- The relevant family also has Get Relevant Anim Time Remaining Fraction. “Fraction” and “ratio” mean the same kind of normalized result here; the different labels come from different getter families.
- Use
<=, not== 0. Animation advances in frame-sized steps and a looping player can wrap before an equality test ever observes exactly zero. - A transition's Duration is how long the crossfade takes after its rule
becomes true. A
0.2-second remaining threshold therefore starts a0.2-second blend near the end; it does not wait until the source pose ends. - Automatic Rule Based on Sequence Player in State uses the most relevant
player for you. A negative
AutomaticRuleTriggerTimeuses the transition's crossfade duration; zero or greater uses that many remaining seconds. - Automatic timing is best for one simple, non-looping Sequence Player. It can choose a surprising player in a blended state, and it does not preserve extra conditions from a hand-written transition graph.
- These values do not describe a Montage in a Slot, state weight, transition completion, or gameplay completion.
Which getter is reading which player?¶
| Choice | Player selection | Output | Best fit |
|---|---|---|---|
| Time Remaining | One compiled asset-player node | Remaining animation seconds | A state has one known one-shot, or one player explicitly owns exit timing. |
| Time Remaining (ratio) | The same compiled player | Remaining fraction of that player's current length | Child Animation Blueprints may substitute clips of different lengths, and a percentage is the intended policy. |
| Get Relevant Anim Time Remaining | Highest-relevance eligible player in the source state | Remaining animation seconds | A blend can make different players dominant at runtime. |
| Get Relevant Anim Time Remaining Fraction | Same relevant-player choice | Remaining fraction | Relevance must be dynamic and the threshold should scale with clip length. |
The named getters are not functions where Blueprint supplies an asset pin. The compiler creates an action for each compatible asset-player node and bakes that player's hidden index into the getter. Search results commonly include the player or asset name so you can tell which one will be read.
The relevant getters do not average every player's remaining time. Asset-player nodes cache their update weight; the state-machine path chooses the eligible player with the greatest relevance. A state like this can therefore switch which clock the getter reports:
Source state
-> Blend by Bool
false: Sequence Player A (weight falling)
true: Sequence Player B (weight rising)
Get Relevant Anim Time Remaining
-> reads A while A is most relevant
-> can jump to B's time when B becomes most relevant
Select an asset-player node and enable Ignore for Relevancy Test when it is a helper/additive player that must never own relevant-time decisions. That is selection policy, not a way to pause or remove the player.
Seconds versus ratio¶
Suppose a non-looping Sequence Player is using a two-second clip and currently
sits at 1.5 seconds:
length = 2.0 seconds
current playback position = 1.5 seconds
Time Remaining ~= 0.5 seconds
Time Remaining (ratio) ~= 0.25
The ratio is relative to the player's current animation length. It is useful when animation overrides can replace a short clip with a longer one. Seconds are useful when the policy is physical time, especially when matching a known crossfade lead.
Neither result is a wall-clock deadline. Play rate, synchronization, skipped animation updates, and runtime asset changes affect how the value advances. Watch the live value when those systems are involved instead of assuming that “0.2 remaining” must take exactly 0.2 real-world seconds.
Ratios also lose information. 0.1 means ten percent of the current player
length, so it is 0.05 seconds on a half-second clip but 0.4 seconds on a
four-second clip. If a crossfade must have enough actual time to finish, compare
the seconds getter with an intentional seconds threshold.
What it actually does¶
The useful mental model is small:
pseudocode - not engine source
named remaining getter:
player = asset player baked into this getter at compile time
return remaining value derived from that player's live length and time
relevant remaining getter:
candidates = eligible asset players in the transition's source state
player = candidate with the greatest cached relevance weight
return remaining value derived from that player's live length and time
ratio/fraction form:
normalize the remaining value against the player's current length
All four are pure reads. They do not stop the player, mark a state complete, request a transition, reset playback, cache a completion flag, or emit a log when the chosen timing source is unsuitable.
The word source matters. For JumpStart -> FallLoop, the transition-time
getter examines asset players in JumpStart, the state being left. It does not
measure the destination's animation and it does not inspect every state in the
machine.
How transition blend time changes the answer¶
A transition rule is tested before the blend begins:
source player advances
-> remaining value crosses the rule threshold
-> Can Enter Transition becomes true
-> crossfade starts
-> source and destination both contribute during Duration
-> transition finishes
For a 0.2-second standard crossfade, this is a common explicit rule:
IsStillInAir
AND Time Remaining for JumpStart <= 0.2
-> Can Enter Transition
The extra Boolean is important: animation time answers when, while gameplay state answers whether. If the character hit a ceiling, was stunned, or left the air early, the project may need a different exit even though the clip has time remaining.
Do not subtract transition Duration from the getter yourself and then compare with zero. Compare the live seconds directly with the desired lead. The transition's blend can also be interrupted; a time getter does not promise that the requested crossfade will finish.
Automatic Rule Based on Sequence Player in State¶
Select the transition arrow and enable Automatic Rule Based on Sequence Player in State when the entire rule is simply “leave near the end of the source state's most relevant player.” It is a transition property, not a node placed in the rule graph.
Its trigger policy is:
AutomaticRuleTriggerTime |
Trigger lead |
|---|---|
Less than 0 |
Use the transition's crossfade Duration. |
0 or greater |
Use this many remaining seconds. |
In a simple one-second Sequence Player with a 0.25-second crossfade and the
default negative trigger value, the intent is to start blending at about
0.25 seconds remaining so the blend can finish near the clip end.
Automatic mode supplies the transition decision instead of evaluating your
ordinary Can Enter Transition timing graph. If the rule also needs
IsInAir, IsEquipped, a combo request, or any other condition, leave
automatic mode off and combine that condition with an explicit remaining-time
comparison.
Where automatic selection goes wrong¶
Automatic mode asks for a relevant player, not “the Sequence Player I meant.” It is easy to make that ambiguous with:
- two players crossfading inside the source state;
- an additive/helper player with greater weight;
- a Blend Space whose player timing does not represent one sample's authored clip length;
- a runtime asset supplied through an exposed pin;
- a Blend Stack or custom asset-player implementation; or
- every intended player marked Ignore for Relevancy Test.
Current UE 5.8 documentation describes the general relevant-player rule, but the public issue tracker also records an unresolved automatic-transition case for a Blend Stack with no valid delta-time record. Treat automatic mode as the convenience path for a simple Sequence Player, not a universal state-complete detector. For a complex state, watch the relevant value and use an explicit condition whose timing source you have verified.
Looping, reverse play, and unusable assets¶
Looping players¶
A looping player wraps to its beginning. Its remaining value describes the end of the current loop, not permanent completion. A small-threshold rule can fire on any lap, and a large frame step can move across the end and wrap before a fragile equality test sees zero.
For a one-shot exit, turn Loop Animation off. For a locomotion loop, transition
from gameplay state such as IsInAir or GroundSpeed, not “the loop ended.”
Reverse playback¶
“Remaining” is an end-oriented name. Reverse playback moves toward the start, and older player types, rate adjustment, and synchronization can make an end-remaining comparison especially unintuitive. Do not use this family as a generic “reverse finished” signal. Use a start/current-time condition that you have watched for that player, an authored notify/event, or explicit gameplay state.
Missing, zero-length, or unresolved players¶
There is no success Boolean. Current runtime paths use numeric fallbacks when
an asset-player index or relevant player cannot be resolved; a missing or
zero-length asset also has no meaningful fraction to normalize. Depending on
the getter path, the observed value can look finished (0) or stay far above
a small threshold. None of those numbers proves that a valid animation ended.
Automatic mode likewise has no player to time and can leave the state stuck. Treat these as configuration failures:
- open the source state and confirm the intended asset is assigned;
- compile the Animation Blueprint after replacing, copying, or renaming a player;
- confirm Loop Animation and Play Rate are intentional;
- confirm at least one intended player participates in relevancy; and
- watch the raw float on the live debug instance before trusting the Boolean.
The getters fail silently: they do not log, branch, or call recovery logic.
The pattern everyone actually uses¶
For a simple, non-looping JumpStart sequence where gameplay state must still
permit the exit:
JumpStart -> FallLoop transition rule
IsInAir
AND Time Remaining (JumpStart Sequence Player) <= 0.15
-> Can Enter Transition
Transition Duration = 0.15
Automatic Rule = off
For a pure authored chain with no extra condition:
EquipStart -> EquippedIdle
EquipStart contains one non-looping Sequence Player
Automatic Rule Based on Sequence Player in State = on
AutomaticRuleTriggerTime = -1
Transition Duration = 0.1
For a state with multiple blended players, first prove what relevance chooses:
temporarily expose/watch:
Get Relevant Anim Time Remaining
Get Relevant Anim Time Remaining Fraction
if the reported clock jumps to an unintended helper player:
mark that helper Ignore for Relevancy Test
or use the named Time Remaining getter for the player that owns timing
The C++ functions underneath use compiler-baked machine, state, transition, and asset-player indices. Ordinary gameplay C++ should usually set the same stable Anim Instance variables that a Blueprint transition reads rather than hard-code those generated indices.
Debug a transition that never becomes true¶
- In Play-In-Editor, choose the correct live Animation Blueprint instance in the Debug Filter. Preview values are not the runtime player.
- Watch the active source state. A getter for
JumpStartis irrelevant if the machine is actually inFallLoopor another transition already won. - Watch the raw remaining float, not only the final comparison Boolean.
- Confirm the named getter's player label matches the current node. Delete and recreate a stale getter after substantial state-graph copies or replacements, then compile.
- For a relevant getter, inspect every asset player and Ignore for Relevancy Test setting. Look for the moment one player's weight overtakes another.
- Turn off looping for a one-shot and use
<= a small lead, never== 0. - Temporarily disable Automatic Rule and build the equivalent explicit comparison. This exposes the live number and separates timing from selection.
- Check transition priority, competing exits, and Max Transitions Per Frame if the expected rule is true but another state wins.
- Verify that a Montage/Slot or linked layer is not visually overriding a state-machine transition that actually occurred.
What these getters do not do¶
- They do not report whether a state is fully blended in or out.
- They do not read a Montage's position, active section, or completion status.
- They do not wait for an Animation Notify or guarantee that one fired.
- They do not select a particular Blend Space sample for you.
- They do not make a looping player become a one-shot.
- They do not replicate animation time or turn presentation into authoritative gameplay state.
- They do not validate that the chosen asset, play direction, or threshold matches the design.
These reads are thread-safe animation getters, but their availability is context-sensitive and their hidden indices are supplied by the Animation Blueprint compiler. They are not general-purpose world Blueprint functions.
Lookalikes - which one do I want?¶
| Node / setting | Use when | Important difference |
|---|---|---|
| Time Remaining | One known asset player owns exit timing. | Seconds; compiler-bound to that player. |
| Time Remaining (ratio) | One known player owns timing and clip lengths may vary. | Normalized fraction; still player-specific. |
| Get Relevant Anim Time Remaining | The dominant player in the source state should own timing. | Player can change as blend weights change. |
| Get Relevant Anim Time Remaining Fraction | Relevant selection plus normalized timing is intentional. | Same dynamic selection, length-relative output. |
| Current Time / Current Time (ratio) | You need progress from the player's start. | Elapsed/progress direction rather than remaining-to-end. |
| Current State Time | Time since the source state became active matters. | Measures state residence, not an asset player's position. |
| Automatic Rule Based on Sequence Player in State | A simple non-looping source should exit near its relevant player's end. | Transition property; replaces the ordinary rule decision. |
| Get Relevant Anim Time Remaining on Animation State Machine Library | An Animation Node Function already has Update Context and an Animation State Result reference. | Explicit node-reference API, not the compiler-generated transition getter. |
| Montage callbacks / Montage timing nodes | A Montage action or section must finish. | Reads the Montage instance rather than a state asset player. |
Rule of thumb: use a named getter for a named clock, a relevant getter for a deliberately dynamic clock, and automatic mode only for the simple case where timing is the whole rule.
Going deeper¶
- Animation State Machines and transition rules - states, one-way transitions, runtime variables, and preview debugging.
- Blend Spaces in Animation Blueprints - why a blended player is not one fixed sequence clock.
- Animation threading and Property Access - how animation update data stays safe on worker threads.
- Animation Montages / Play Montage - the separate completion and callback path for Montage actions.
- Blueprint Debugger, breakpoints, and watch values - select the live instance and inspect the raw timing value.
- Official caveat: UE-212748 records the unresolved Blend Stack automatic-transition case.
- Engine source (requires engine access - we do not reproduce it here):
UAnimInstance::GetInstanceAssetPlayerTimeFromEnd,UAnimInstance::GetInstanceAssetPlayerTimeFromEndFraction, and the relevant getter family inEngine/Source/Runtime/Engine/Private/Animation/AnimInstance.cpp; relevant-player selection and automatic rule evaluation inFAnimNode_StateMachineunderEngine/Source/Runtime/Engine/Private/Animation/AnimNode_StateMachine.cpp; declarations and getter metadata in the matchingClasses/Animationheaders.