UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
AnimNode_StateMachine.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
9#include "AlphaBlend.h"
14#include "AnimNode_StateMachine.generated.h"
15
21
22// Information about an active transition on the transition stack
23USTRUCT()
25{
27
28 // Elapsed time for this transition
29 float ElapsedTime;
30
31 // The transition alpha between next and previous states
32 float Alpha;
33
34 // Duration of this cross-fade (may be shorter than the nominal duration specified by the state machine if the target state had non-zero weight at the start)
35 float CrossfadeDuration;
36
37 // Cached Pose for this transition
38 TArray<FTransform> InputPose;
39
40 // Graph to run that determines the final pose for this transition
41 FPoseLink CustomTransitionGraph;
42
43 // To and from state ids
44 int32 NextState;
45
46 int32 PreviousState;
47
48 // Notifies are copied from the reference transition info
49 int32 StartNotify;
50
51 int32 EndNotify;
52
53 int32 InterruptNotify;
54
56
57 // Blend data used for per-bone animation evaluation
58 TArray<FBlendSampleData> StateBlendData;
59
60 TArray<int32, TInlineAllocator<3>> SourceTransitionIndices;
61
63 // Blend object to handle alpha interpolation
65
66public:
67 // Blend profile to use for this transition. Specifying this will make the transition evaluate per-bone
68 UPROPERTY()
70
71 // Type of blend to use
72 EAlphaBlendOption BlendOption;
73
75
76 // Is this transition active?
77 bool bActive;
78
79public:
82
83 UE_DEPRECATED(5.1, "Please use FAnimationActiveTransitionEntry constructor with different signature")
85
86 void InitializeCustomGraphLinks(const FAnimationUpdateContext& Context, const FBakedStateExitTransition& TransitionRule);
87
89
92
93 bool Serialize(FArchive& Ar);
94
96 float CalculateInverseAlpha(EAlphaBlendOption BlendMode, float InFraction) const;
97 float CalculateAlpha(float InFraction) const;
98};
99
100USTRUCT()
102{
104
105 int32 TargetState;
106 float CrossfadeTimeAdjustment;
107
108 const FBakedStateExitTransition* TransitionRule;
109
110 TArray<int32, TInlineAllocator<3>> SourceTransitionIndices;
111
112public:
114 bool IsValid() const;
115 void Clear();
116};
117
118//@TODO: ANIM: Need to implement WithSerializer and Identical for FAnimationActiveTransitionEntry?
119
120// State machine node
121USTRUCT()
123{
125
126public:
127 // Index into the BakedStateMachines array in the owning UAnimBlueprintGeneratedClass
128 UPROPERTY()
129 int32 StateMachineIndexInClass;
130
131 // The maximum number of transitions that can be taken by this machine 'simultaneously' in a single frame
132 UPROPERTY(EditAnywhere, Category=Settings)
133 int32 MaxTransitionsPerFrame;
134
135 // The maximum number of transition requests that can be buffered at any time.
136 // The oldest transition requests are dropped to accommodate for newly created requests.
137 UPROPERTY(EditAnywhere, Category = Settings, meta = (ClampMin = "0"))
138 int32 MaxTransitionsRequests = 32;
139
140 // When the state machine becomes relevant, it is initialized into the Entry state.
141 // It then tries to take any valid transitions to possibly end up in a different state on that same frame.
142 // - if true, that new state starts full weight.
143 // - if false, a blend is created between the entry state and that new state.
144 // In either case all visited State notifications (Begin/End) will be triggered.
145 UPROPERTY(EditAnywhere, Category = Settings)
146 bool bSkipFirstUpdateTransition;
147
148 // Reinitialize the state machine if we have become relevant to the graph
149 // after not being ticked on the previous frame(s)
150 UPROPERTY(EditAnywhere, Category = Settings)
151 bool bReinitializeOnBecomingRelevant;
152
153 // Tag Notifies with meta data such as the active state and mirroring state. Producing this
154 // data has a slight performance cost.
155 UPROPERTY(EditAnywhere, Category = Settings)
156 bool bCreateNotifyMetaData;
157
158 // Allows a conduit to be used as this state machine's entry state
159 // If a valid entry state cannot be found at runtime then this will generate a reference pose!
160 UPROPERTY(EditAnywhere, Category = Settings)
161 bool bAllowConduitEntryStates;
162private:
163 // true if it is the first update.
164 bool bFirstUpdate;
165
166public:
167
168 int32 GetCurrentState() const
169 {
170 return CurrentState;
171 }
172
174 {
175 return ElapsedTime;
176 }
177
178 ENGINE_API FName GetCurrentStateName() const;
179
180 ENGINE_API bool IsTransitionActive(int32 TransIndex) const;
181
182protected:
183 // The current state within the state machine
185
186 // Elapsed time since entering the current state
188
189 // Current Transition Index being evaluated
191
192 // The state machine description this is an instance of
194
195 // The set of active transitions, if there are any
197
198 // The set of states in this state machine
200
201 // Used during transitions to make sure we don't double tick a state if it appears multiple times
203
204 // Delegates that native code can hook into to handle state entry
206
207 // Delegates that native code can hook into to handle state exits
209
210 // All alive transition requests that have been queued
212
213#if WITH_EDITORONLY_DATA
214 // The set of transition requests handled this update
216#endif
217
218private:
219 TArray<FPoseContext*> StateCachedPoses;
220
221 FGraphTraversalCounter UpdateCounter;
222
223 TArray<FGraphTraversalCounter> StateCacheBoneCounters;
224
225 // The last time that each respective state was entered
226 TArray<double> LastStateEntryTime;
227
228#if WITH_EDITOR
230#endif
231
232public:
234 : StateMachineIndexInClass(0)
235 , MaxTransitionsPerFrame(3)
236 , bSkipFirstUpdateTransition(true)
237 , bReinitializeOnBecomingRelevant(true)
238 , bCreateNotifyMetaData(true)
239 , bAllowConduitEntryStates(false)
240 , bFirstUpdate(true)
241 , CurrentState(INDEX_NONE)
242 , ElapsedTime(0.0f)
243 , PRIVATE_MachineDescription(NULL)
244 {
245 }
246
247 // FAnimNode_Base interface
250 ENGINE_API virtual void Update_AnyThread(const FAnimationUpdateContext& Context) override;
251 ENGINE_API virtual void Evaluate_AnyThread(FPoseContext& Output) override;
252 ENGINE_API virtual void GatherDebugData(FNodeDebugData& DebugData) override;
253 // End of FAnimNode_Base interface
254
255 ENGINE_API void ConditionallyCacheBonesForState(int32 StateIndex, FAnimationBaseContext Context);
256
257 // Returns the blend weight of the specified state, as calculated by the last call to Update()
258 ENGINE_API float GetStateWeight(int32 StateIndex) const;
259
260 ENGINE_API const FBakedAnimationState& GetStateInfo(int32 StateIndex) const;
261 ENGINE_API const FAnimationTransitionBetweenStates& GetTransitionInfo(int32 TransIndex) const;
262
263 ENGINE_API bool IsValidTransitionIndex(int32 TransitionIndex) const;
264
266 ENGINE_API void CacheMachineDescription(IAnimClassInterface* AnimBlueprintClass);
267
270 ENGINE_API const int32 GetStateIndex(FName StateName) const;
271
272protected:
273 // Tries to get the instance information for the state machine
274 ENGINE_API const FBakedAnimationStateMachine* GetMachineDescription() const;
275
276 ENGINE_API void SetStateInternal(int32 NewStateIndex);
277
278 ENGINE_API const FBakedAnimationState& GetStateInfo() const;
279 ENGINE_API const int32 GetStateIndex(const FBakedAnimationState& StateInfo) const;
280
281 // finds the highest priority valid transition, information pass via the OutPotentialTransition variable.
282 // OutVisitedStateIndices will let you know what states were checked, but is also used to make sure we don't get stuck in an infinite loop or recheck states
283 ENGINE_API bool FindValidTransition(const FAnimationUpdateContext& Context,
287
288 // Helper function that will update the states associated with a transition
289 ENGINE_API void UpdateTransitionStates(const FAnimationUpdateContext& Context, FAnimationActiveTransitionEntry& Transition);
290
291 // helper function to test if a state is a conduit
292 ENGINE_API bool IsAConduitState(int32 StateIndex) const;
293
294 // helper functions for calling update and evaluate on state nodes
295 ENGINE_API void UpdateState(int32 StateIndex, const FAnimationUpdateContext& Context);
296 ENGINE_API const FPoseContext& EvaluateState(int32 StateIndex, const FPoseContext& Context);
297
298 // transition type evaluation functions
299 ENGINE_API void EvaluateTransitionStandardBlend(FPoseContext& Output, FAnimationActiveTransitionEntry& Transition, bool bIntermediatePoseIsValid);
300 ENGINE_API void EvaluateTransitionStandardBlendInternal(FPoseContext& Output, FAnimationActiveTransitionEntry& Transition, const FPoseContext& PreviousStateResult, const FPoseContext& NextStateResult);
301 ENGINE_API void EvaluateTransitionCustomBlend(FPoseContext& Output, FAnimationActiveTransitionEntry& Transition, bool bIntermediatePoseIsValid);
302
303 // Get the time remaining in seconds for the most relevant animation in the source state
304 ENGINE_API float GetRelevantAnimTimeRemaining(const FAnimInstanceProxy* InAnimInstanceProxy, int32 StateIndex) const;
306 {
307 return GetRelevantAnimTimeRemaining(Context.AnimInstanceProxy, StateIndex);
308 }
309
310 // Get the time remaining as a fraction of the duration for the most relevant animation in the source state
311 ENGINE_API float GetRelevantAnimTimeRemainingFraction(const FAnimInstanceProxy* InAnimInstanceProxy, int32 StateIndex) const;
313 {
314 return GetRelevantAnimTimeRemainingFraction(Context.AnimInstanceProxy, StateIndex);
315 }
316
317 UE_DEPRECATED(5.1, "Please use GetRelevantAssetPlayerInterfaceFromState")
318 const FAnimNode_AssetPlayerBase* GetRelevantAssetPlayerFromState(const FAnimInstanceProxy* InAnimInstanceProxy, const FBakedAnimationState& StateInfo) const
319 {
320 return nullptr;
321 }
322
323 UE_DEPRECATED(5.1, "Please use GetRelevantAssetPlayerInterfaceFromState")
324 const FAnimNode_AssetPlayerBase* GetRelevantAssetPlayerFromState(const FAnimationUpdateContext& Context, const FBakedAnimationState& StateInfo) const
325 {
326 return nullptr;
327 }
328
329 ENGINE_API const FAnimNode_AssetPlayerRelevancyBase* GetRelevantAssetPlayerInterfaceFromState(const FAnimInstanceProxy* InAnimInstanceProxy, const FBakedAnimationState& StateInfo) const;
331 {
332 return GetRelevantAssetPlayerInterfaceFromState(Context.AnimInstanceProxy, StateInfo);
333 }
334
335 ENGINE_API virtual void LogInertializationRequestError(const FAnimationUpdateContext& Context, int32 PreviousState, int32 NextState);
336
338 ENGINE_API bool RequestTransitionEvent(const FTransitionEvent& InTransitionEvent);
339
341 ENGINE_API void ClearTransitionEvents(const FName& EventName);
342
344 ENGINE_API void ClearAllTransitionEvents();
345
347 ENGINE_API bool QueryTransitionEvent(const int32 TransitionIndex, const FName& EventName) const;
348
350 ENGINE_API bool QueryAndMarkTransitionEvent(const int32 TransitionIndex, const FName& EventName);
351
353 ENGINE_API void ConsumeMarkedTransitionEvents();
354
355#if WITH_EDITOR
357 {
359 }
360#endif
361
362public:
363 friend struct FAnimInstanceProxy;
365 friend class FAnimationBlueprintEditor;
366};
#define NULL
Definition oodle2base.h:134
EAlphaBlendOption
Definition AlphaBlend.h:13
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
return true
Definition ExternalRpcRegistry.cpp:601
void SetState(uint64 Value)
Definition LockFreeList.h:52
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
#define USTRUCT(...)
Definition ObjectMacros.h:746
#define GENERATED_USTRUCT_BODY(...)
Definition ObjectMacros.h:767
USkinnedMeshComponent float
Definition SkinnedMeshComponent.h:60
Definition Archive.h:1208
Definition NameTypes.h:617
Definition AnimClassInterface.h:193
Definition Array.h:670
Definition EnumAsByte.h:22
Definition ContainerAllocationPolicies.h:894
Definition AnimationStateMachineLibrary.h:35
Definition BlendProfile.h:132
Definition AnimStateMachineTypes.h:45
@ false
Definition radaudio_common.h:23
Definition AlphaBlend.h:71
Definition AnimInstanceProxy.h:144
Definition AnimNode_AssetPlayerBase.h:15
Definition AnimNode_RelevantAssetPlayerBase.h:14
Definition AnimNodeBase.h:853
Definition AnimNode_StateMachine.h:123
TArray< FOnGraphStateChanged > OnGraphStatesExited
Definition AnimNode_StateMachine.h:208
FAnimNode_StateMachine()
Definition AnimNode_StateMachine.h:233
TArray< FAnimationActiveTransitionEntry > ActiveTransitionArray
Definition AnimNode_StateMachine.h:196
int32 CurrentState
Definition AnimNode_StateMachine.h:184
TArray< FPoseLink > StatePoseLinks
Definition AnimNode_StateMachine.h:199
float GetRelevantAnimTimeRemainingFraction(const FAnimationUpdateContext &Context, int32 StateIndex) const
Definition AnimNode_StateMachine.h:312
int32 EvaluatingTransitionIndex
Definition AnimNode_StateMachine.h:190
const FBakedAnimationStateMachine * PRIVATE_MachineDescription
Definition AnimNode_StateMachine.h:193
TArray< FOnGraphStateChanged > OnGraphStatesEntered
Definition AnimNode_StateMachine.h:205
float GetCurrentStateElapsedTime() const
Definition AnimNode_StateMachine.h:173
TArray< FTransitionEvent > QueuedTransitionEvents
Definition AnimNode_StateMachine.h:211
float ElapsedTime
Definition AnimNode_StateMachine.h:187
const FAnimNode_AssetPlayerRelevancyBase * GetRelevantAssetPlayerInterfaceFromState(const FAnimationUpdateContext &Context, const FBakedAnimationState &StateInfo) const
Definition AnimNode_StateMachine.h:330
float GetRelevantAnimTimeRemaining(const FAnimationUpdateContext &Context, int32 StateIndex) const
Definition AnimNode_StateMachine.h:305
TArray< int32 > StatesUpdated
Definition AnimNode_StateMachine.h:202
Definition AnimNode_TransitionPoseEvaluator.h:46
virtual ENGINE_API void Update_AnyThread(const FAnimationUpdateContext &Context) override
Definition AnimNode_TransitionPoseEvaluator.cpp:55
virtual ENGINE_API void CacheBones_AnyThread(const FAnimationCacheBonesContext &Context) override
Definition AnimNode_TransitionPoseEvaluator.cpp:40
virtual ENGINE_API void Evaluate_AnyThread(FPoseContext &Output) override
Definition AnimNode_TransitionPoseEvaluator.cpp:69
virtual ENGINE_API void GatherDebugData(FNodeDebugData &DebugData) override
Definition AnimNode_TransitionPoseEvaluator.cpp:83
virtual ENGINE_API void Initialize_AnyThread(const FAnimationInitializeContext &Context) override
Definition AnimNode_TransitionPoseEvaluator.cpp:34
Definition AnimNode_StateMachine.h:25
Definition AnimNodeBase.h:159
Definition AnimNodeBase.h:337
Definition AnimNodeBase.h:324
Definition AnimNode_StateMachine.h:102
Definition AnimStateMachineTypes.h:187
Definition AnimNodeBase.h:354
Definition AnimStateMachineTypes.h:364
Definition AnimStateMachineTypes.h:308
Definition AnimStateMachineTypes.h:256
Definition AnimationAsset.h:122
Definition AnimTypes.h:144
Definition AnimNodeBase.h:642
Definition AnimNodeBase.h:479
Definition AnimStateMachineTypes.h:55
Definition ObjectPtr.h:488