UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
RootMotionSource.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"
8#include "UObject/Class.h"
11#include "RootMotionSource.generated.h"
12
13class ACharacter;
15class UCurveFloat;
16class UCurveVector;
17
18#define ROOT_MOTION_DEBUG (1 && !(UE_BUILD_SHIPPING || UE_BUILD_TEST))
19
20#if ROOT_MOTION_DEBUG
27#endif
28
32UENUM()
34{
35 // Sets velocity to this value directly
36 Override = 0,
37 // Gets added on top of existing velocity
38 Additive = 1
39};
40
44UENUM()
46{
47 // Source has been Prepared and can contribute to root motion
48 Prepared = 0x01,
49 // Source has timed out or otherwise reached a state where it is considered "done"
50 Finished = 0x02,
51 // Source has been queued for removal, will be removed next PrepareRootMotion() by the SourceGroup
52 MarkedForRemoval = 0x04
53};
54
58UENUM()
60{
61 // Source will switch character to Falling mode with any "Z up" velocity added.
62 // Use this for jump-like root motion. If not enabled, uses default jump impulse
63 // detection (which keeps you stuck on ground in Walking fairly strongly)
65 // If Duration of Source would end partway through the last tick it is active,
66 // do not reduce SimulationTime. Disabling this is useful for sources that
67 // are more about providing velocity (like jumps), vs. sources that need
68 // the precision of partial ticks for say ending up at an exact location (MoveTo)
70 // Whether to ignore impact to Z when accumulating output to Velocity
71 // Setting this flag on override sources provides the same behavior as
72 // animation root motion
74
75};
76
77enum class ERootMotionSourceID : uint16 { Invalid = 0 };
78
83{
85
86 uint16 ServerID; // ID of root motion source on server
87 uint16 LocalID; // ID of root motion source on local client
88 float TimeStamp; // Last time this ID mapping was updated/still valid
89
90 // Given CurrentTimeStamp, returns whether this mapping is still valid (has expired yet)
91 ENGINE_API bool IsStillValid(float CurrentTimeStamp);
92};
93
98USTRUCT()
114
119USTRUCT()
121{
123
124 UPROPERTY()
126
128
129 ENGINE_API void Clear();
130
132 ENGINE_API void UnSetFlag(ERootMotionSourceSettingsFlags Flag);
133 ENGINE_API bool HasFlag(ERootMotionSourceSettingsFlags Flag) const;
134
135 // Accumulate settings with one another
137};
138
139UENUM()
141{
142 // Maintain the last velocity root motion gave to the character
144 // Set Velocity to the specified value (for example, 0,0,0 to stop the character)
146 // Clamp velocity magnitude to the specified value. Note that it will not clamp Z if negative (falling). it will clamp Z positive though.
148};
149
153USTRUCT()
155{
157
158 // Mode, see ERootMotionFinishVelocityMode
159 UPROPERTY()
161
162 // Clamp Velocity if Move == ClampVelocity
163 UPROPERTY()
165
166 // Set Velocity if Mode == SetVelocity
167 UPROPERTY()
169
175};
176
177// Hacky base class to avoid 8 bytes of padding after the vtable
179{
180 virtual ~FRootMotionSourceFixLayout() = default;
181};
182
222USTRUCT()
224#if CPP
226#endif
227{
229
230
231 UPROPERTY()
233
236 UPROPERTY()
237 uint16 LocalID;
238
242 UPROPERTY()
243 FName InstanceName;
244
250 UPROPERTY(NotReplicated)
251 float StartTime;
252
254 UPROPERTY()
255 float CurrentTime;
256
258 UPROPERTY(NotReplicated)
259 float PreviousTime;
260
262 UPROPERTY()
263 float Duration;
264
266 UPROPERTY()
268
270 UPROPERTY(NotReplicated)
272
276 UPROPERTY()
278
280 UPROPERTY()
281 bool bInLocalSpace;
282
287 bool bNeedsSimulatedCatchup;
288
296 bool bSimulatedNeedsSmoothing;
297
299 UPROPERTY(NotReplicated)
301
303 UPROPERTY(NotReplicated)
305
307
309
311 ENGINE_API float GetTime() const;
312
314 ENGINE_API float GetStartTime() const;
315
317 ENGINE_API bool IsStartTimeValid() const;
318
320 ENGINE_API float GetDuration() const;
321
323 ENGINE_API virtual bool IsTimeOutEnabled() const;
324
326 ENGINE_API virtual FRootMotionSource* Clone() const;
327
350 ENGINE_API virtual bool Matches(const FRootMotionSource* Other) const;
351
353 ENGINE_API virtual bool MatchesAndHasSameState(const FRootMotionSource* Other) const;
354
364 ENGINE_API virtual bool UpdateStateFrom(const FRootMotionSource* SourceToTakeStateFrom, bool bMarkForSimulatedCatchup = false);
365
367 ENGINE_API virtual bool IsActive() const;
368
370 ENGINE_API virtual void SetTime(float NewTime);
371
373 ENGINE_API virtual void CheckTimeOut();
374
391 ENGINE_API virtual void PrepareRootMotion(
392 float SimulationTime,
393 float MovementTickTime,
394 const ACharacter& Character,
395 const UCharacterMovementComponent& MoveComponent
396 );
397
398 ENGINE_API virtual bool NetSerialize(FArchive& Ar, UPackageMap* Map, bool& bOutSuccess);
399
400 ENGINE_API virtual UScriptStruct* GetScriptStruct() const;
401
402 ENGINE_API virtual FString ToSimpleString() const;
403
404 virtual void AddReferencedObjects(class FReferenceCollector& Collector) {}
405};
406
407template<>
409{
410 enum
411 {
413 WithCopy = true
414 };
415};
416
418USTRUCT()
420{
422
424
426
427 UPROPERTY()
429
430 UPROPERTY()
431 TObjectPtr<UCurveFloat> StrengthOverTime;
432
434
435 ENGINE_API virtual bool Matches(const FRootMotionSource* Other) const override;
436
437 ENGINE_API virtual bool MatchesAndHasSameState(const FRootMotionSource* Other) const override;
438
440
441 ENGINE_API virtual void PrepareRootMotion(
442 float SimulationTime,
443 float MovementTickTime,
444 const ACharacter& Character,
445 const UCharacterMovementComponent& MoveComponent
446 ) override;
447
448 ENGINE_API virtual bool NetSerialize(FArchive& Ar, UPackageMap* Map, bool& bOutSuccess) override;
449
450 ENGINE_API virtual UScriptStruct* GetScriptStruct() const override;
451
452 ENGINE_API virtual FString ToSimpleString() const override;
453
454 ENGINE_API virtual void AddReferencedObjects(class FReferenceCollector& Collector) override;
455};
456
457template<>
459{
460 enum
461 {
462 WithNetSerializer = true,
463 WithCopy = true
464 };
465};
466
467
469USTRUCT()
471{
473
475
477
478 UPROPERTY()
479 FVector Location;
480
481 UPROPERTY()
482 TObjectPtr<AActor> LocationActor;
483
484 UPROPERTY()
485 float Radius;
486
487 UPROPERTY()
488 float Strength;
489
490 UPROPERTY()
491 bool bIsPush;
492
493 UPROPERTY()
494 bool bNoZForce;
495
496 UPROPERTY()
497 TObjectPtr<UCurveFloat> StrengthDistanceFalloff;
498
499 UPROPERTY()
500 TObjectPtr<UCurveFloat> StrengthOverTime;
501
502 UPROPERTY()
503 bool bUseFixedWorldDirection;
504
505 UPROPERTY()
506 FRotator FixedWorldDirection;
507
509
510 ENGINE_API virtual bool Matches(const FRootMotionSource* Other) const override;
511
512 ENGINE_API virtual bool MatchesAndHasSameState(const FRootMotionSource* Other) const override;
513
515
516 ENGINE_API virtual void PrepareRootMotion(
517 float SimulationTime,
518 float MovementTickTime,
519 const ACharacter& Character,
520 const UCharacterMovementComponent& MoveComponent
521 ) override;
522
523 ENGINE_API virtual bool NetSerialize(FArchive& Ar, UPackageMap* Map, bool& bOutSuccess) override;
524
525 ENGINE_API virtual UScriptStruct* GetScriptStruct() const override;
526
527 ENGINE_API virtual FString ToSimpleString() const override;
528
529 ENGINE_API virtual void AddReferencedObjects(class FReferenceCollector& Collector) override;
530};
531
532template<>
534{
535 enum
536 {
537 WithNetSerializer = true,
538 WithCopy = true
539 };
540};
541
542
544USTRUCT()
546{
548
550
552
553 UPROPERTY()
554 FVector StartLocation;
555
556 UPROPERTY()
557 FVector TargetLocation;
558
559 UPROPERTY()
560 bool bRestrictSpeedToExpected;
561
562 UPROPERTY()
563 TObjectPtr<UCurveVector> PathOffsetCurve;
564
565 ENGINE_API FVector GetPathOffsetInWorldSpace(const float MoveFraction) const;
566
568
569 ENGINE_API virtual bool Matches(const FRootMotionSource* Other) const override;
570
571 ENGINE_API virtual bool MatchesAndHasSameState(const FRootMotionSource* Other) const override;
572
574
575 ENGINE_API virtual void SetTime(float NewTime) override;
576
577 ENGINE_API virtual void PrepareRootMotion(
578 float SimulationTime,
579 float MovementTickTime,
580 const ACharacter& Character,
581 const UCharacterMovementComponent& MoveComponent
582 ) override;
583
584 ENGINE_API virtual bool NetSerialize(FArchive& Ar, UPackageMap* Map, bool& bOutSuccess) override;
585
586 ENGINE_API virtual UScriptStruct* GetScriptStruct() const override;
587
588 ENGINE_API virtual FString ToSimpleString() const override;
589
590 ENGINE_API virtual void AddReferencedObjects(class FReferenceCollector& Collector) override;
591};
592
593template<>
595{
596 enum
597 {
598 WithNetSerializer = true,
599 WithCopy = true
600 };
601};
602
603
608USTRUCT()
610{
612
614
616
617 UPROPERTY()
618 FVector StartLocation;
619
620 UPROPERTY()
621 FVector InitialTargetLocation;
622
623 // Dynamically-changing location of target, which may be altered while this movement is ongoing
624 UPROPERTY()
625 FVector TargetLocation;
626
627 UPROPERTY()
628 bool bRestrictSpeedToExpected;
629
630 UPROPERTY()
631 TObjectPtr<UCurveVector> PathOffsetCurve;
632
633 UPROPERTY()
634 TObjectPtr<UCurveFloat> TimeMappingCurve;
635
636 ENGINE_API void SetTargetLocation(FVector NewTargetLocation);
637
638 ENGINE_API FVector GetPathOffsetInWorldSpace(const float MoveFraction) const;
639
641
642 ENGINE_API virtual bool Matches(const FRootMotionSource* Other) const override;
643
644 ENGINE_API virtual bool MatchesAndHasSameState(const FRootMotionSource* Other) const override;
645
647
648 ENGINE_API virtual void SetTime(float NewTime) override;
649
650 ENGINE_API virtual void PrepareRootMotion(
651 float SimulationTime,
652 float MovementTickTime,
653 const ACharacter& Character,
654 const UCharacterMovementComponent& MoveComponent
655 ) override;
656
657 ENGINE_API virtual bool NetSerialize(FArchive& Ar, UPackageMap* Map, bool& bOutSuccess) override;
658
659 ENGINE_API virtual UScriptStruct* GetScriptStruct() const override;
660
661 ENGINE_API virtual FString ToSimpleString() const override;
662
663 ENGINE_API virtual void AddReferencedObjects(class FReferenceCollector& Collector) override;
664};
665
666template<>
675
676
678USTRUCT()
680{
682
684
686
687 UPROPERTY()
689
690 UPROPERTY()
691 float Distance;
692
693 UPROPERTY()
694 float Height;
695
696 UPROPERTY()
697 bool bDisableTimeout;
698
699 UPROPERTY()
700 TObjectPtr<UCurveVector> PathOffsetCurve;
701
702 UPROPERTY()
703 TObjectPtr<UCurveFloat> TimeMappingCurve;
704
705 FVector SavedHalfwayLocation;
706
707 ENGINE_API FVector GetPathOffset(float MoveFraction) const;
708
709 ENGINE_API FVector GetRelativeLocation(float MoveFraction) const;
710
711 ENGINE_API virtual bool IsTimeOutEnabled() const override;
712
714
715 ENGINE_API virtual bool Matches(const FRootMotionSource* Other) const override;
716
717 ENGINE_API virtual bool MatchesAndHasSameState(const FRootMotionSource* Other) const override;
718
720
721 ENGINE_API virtual void PrepareRootMotion(
722 float SimulationTime,
723 float MovementTickTime,
724 const ACharacter& Character,
725 const UCharacterMovementComponent& MoveComponent
726 ) override;
727
728 ENGINE_API virtual bool NetSerialize(FArchive& Ar, UPackageMap* Map, bool& bOutSuccess) override;
729
730 ENGINE_API virtual UScriptStruct* GetScriptStruct() const override;
731
732 ENGINE_API virtual FString ToSimpleString() const override;
733
734 ENGINE_API virtual void AddReferencedObjects(class FReferenceCollector& Collector) override;
735};
736
737template<>
739{
740 enum
741 {
742 WithNetSerializer = true,
743 WithCopy = true
744 };
745};
746
751USTRUCT()
753{
755
757
759
762
765
769 UPROPERTY()
770 uint8 bHasAdditiveSources:1;
771
775 UPROPERTY()
776 uint8 bHasOverrideSources:1;
777
781 UPROPERTY()
782 uint8 bHasOverrideSourcesWithIgnoreZAccumulate:1;
783
786 UPROPERTY()
787 uint8 bIsAdditiveVelocityApplied:1;
788
790 UPROPERTY()
791 FRootMotionSourceSettings LastAccumulatedSettings;
792
798 UPROPERTY()
799 FVector_NetQuantize10 LastPreAdditiveVelocity;
800
801 ENGINE_API void CleanUpInvalidRootMotion(float DeltaTime, const ACharacter& Character, UCharacterMovementComponent& MoveComponent);
802
809 ENGINE_API void PrepareRootMotion(float DeltaTime, const ACharacter& Character, const UCharacterMovementComponent& InMoveComponent, bool bForcePrepareAll = false);
810
812 ENGINE_API void AccumulateOverrideRootMotionVelocity(float DeltaTime, const ACharacter& Character, const UCharacterMovementComponent& MoveComponent, FVector& InOutVelocity) const;
813
815 ENGINE_API void AccumulateAdditiveRootMotionVelocity(float DeltaTime, const ACharacter& Character, const UCharacterMovementComponent& MoveComponent, FVector& InOutVelocity) const;
816
818 ENGINE_API bool GetOverrideRootMotionRotation(float DeltaTime, const ACharacter& Character, const UCharacterMovementComponent& MoveComponent, FQuat& OutRotation) const;
819
821 ENGINE_API bool NeedsSimulatedSmoothing() const;
822
824 ENGINE_API void SetPendingRootMotionSourceMinStartTimes(float NewStartTime);
825
827 ENGINE_API void ApplyTimeStampReset(float DeltaTime);
828
830 ENGINE_API bool HasOverrideVelocity() const;
831
833 ENGINE_API bool HasOverrideVelocityWithIgnoreZAccumulate() const;
834
836 ENGINE_API bool HasAdditiveVelocity() const;
837
839 ENGINE_API bool HasVelocity() const;
840
842 ENGINE_API bool HasActiveRootMotionSources() const;
843
846 ENGINE_API bool HasRootMotionToApply() const;
847
851
853 ENGINE_API TSharedPtr<FRootMotionSource> GetRootMotionSource(FName InstanceName);
854
857
859 ENGINE_API void RemoveRootMotionSource(FName InstanceName);
860
862 ENGINE_API void RemoveRootMotionSourceByID(uint16 RootMotionSourceID);
863
872
874 ENGINE_API bool NetSerialize(FArchive& Ar, class UPackageMap* Map, bool& bOutSuccess, uint8 MaxNumRootMotionSourcesToSerialize = MAX_uint8);
875
877 ENGINE_API void Clear();
878
880 ENGINE_API void CullInvalidSources();
881
884
886 ENGINE_API bool operator==(const FRootMotionSourceGroup& Other) const;
887
889 ENGINE_API bool operator!=(const FRootMotionSourceGroup& Other) const;
890
892 ENGINE_API void AddStructReferencedObjects(FReferenceCollector& Collector) const;
893
895
897 ENGINE_API void AccumulateRootMotionVelocity(ERootMotionAccumulateMode RootMotionType, float DeltaTime, const ACharacter& Character, const UCharacterMovementComponent& MoveComponent, FVector& InOutVelocity) const;
898
900 ENGINE_API void AccumulateRootMotionVelocityFromSource(const FRootMotionSource& RootMotionSource, float DeltaTime, const ACharacter& Character, const UCharacterMovementComponent& MoveComponent, FVector& InOutVelocity) const;
901
904
905};
906
907template<>
909{
910 enum
911 {
912 WithCopy = true, // Necessary so that TSharedPtr<FRootMotionSource> Data is copied around
913 WithNetSerializer = true,
914 WithIdenticalViaEquality = true,
915 WithAddStructReferencedObjects = true,
916 };
917};
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define MAX_uint8
Definition NumericLimits.h:19
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
#define UENUM(...)
Definition ObjectMacros.h:749
#define USTRUCT(...)
Definition ObjectMacros.h:746
#define GENERATED_USTRUCT_BODY(...)
Definition ObjectMacros.h:767
ERootMotionAccumulateMode
Definition RootMotionSource.h:34
ERootMotionSourceSettingsFlags
Definition RootMotionSource.h:60
ERootMotionSourceStatusFlags
Definition RootMotionSource.h:46
ERootMotionFinishVelocityMode
Definition RootMotionSource.h:141
ERootMotionSourceID
Definition RootMotionSource.h:77
uint8_t uint8
Definition binka_ue_file_header.h:8
uint16_t uint16
Definition binka_ue_file_header.h:7
Definition Actor.h:257
Definition Character.h:242
Definition Archive.h:1208
Definition NameTypes.h:617
Definition UObjectGlobals.h:2492
Definition Array.h:670
Definition IConsoleManager.h:1792
Definition SharedPointer.h:692
Definition CharacterMovementComponent.h:136
Definition CurveFloat.h:31
Definition CurveVector.h:31
Definition CoreNet.h:191
Definition Class.h:1720
@ false
Definition radaudio_common.h:23
Definition RootMotionSource.h:155
Definition AnimationAsset.h:711
Definition RootMotionSource.h:83
ENGINE_API FRootMotionServerToLocalIDMapping()
Definition RootMotionSource.cpp:99
ENGINE_API bool IsStillValid(float CurrentTimeStamp)
Definition RootMotionSource.cpp:106
uint16 LocalID
Definition RootMotionSource.h:87
uint16 ServerID
Definition RootMotionSource.h:86
float TimeStamp
Definition RootMotionSource.h:88
Definition RootMotionSource.h:179
virtual ~FRootMotionSourceFixLayout()=default
Definition RootMotionSource.h:753
TArray< TSharedPtr< FRootMotionSource > > PendingAddRootMotionSources
Definition RootMotionSource.h:764
TArray< TSharedPtr< FRootMotionSource > > RootMotionSources
Definition RootMotionSource.h:761
virtual ~FRootMotionSourceGroup()
Definition RootMotionSource.h:758
Definition RootMotionSource.h:121
Definition RootMotionSource.h:100
Definition RootMotionSource.h:420
virtual ~FRootMotionSource_ConstantForce()
Definition RootMotionSource.h:425
Definition RootMotionSource.h:680
virtual ~FRootMotionSource_JumpForce()
Definition RootMotionSource.h:685
Definition RootMotionSource.h:610
virtual ~FRootMotionSource_MoveToDynamicForce()
Definition RootMotionSource.h:615
Definition RootMotionSource.h:546
virtual ~FRootMotionSource_MoveToForce()
Definition RootMotionSource.h:551
Definition RootMotionSource.h:471
virtual ~FRootMotionSource_RadialForce()
Definition RootMotionSource.h:476
Definition RootMotionSource.h:227
virtual void AddReferencedObjects(class FReferenceCollector &Collector)
Definition RootMotionSource.h:404
Definition NetSerialization.h:455
Definition RootMotionSource.h:22
static ENGINE_API void PrintOnScreen(const ACharacter &InCharacter, const FString &InString)
static ENGINE_API TAutoConsoleVariable< int32 > CVarDebugRootMotionSources
Definition RootMotionSource.h:23
static ENGINE_API void PrintOnScreenServerMsg(const FString &InString)
Definition ObjectPtr.h:488
Definition StructOpsTypeTraits.h:11
@ WithNetSerializer
Definition StructOpsTypeTraits.h:26
@ WithCopy
Definition StructOpsTypeTraits.h:17
Definition StructOpsTypeTraits.h:46