// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Engine/HitResult.h" #include "GameFramework/CharacterMovementComponent.h" #include "Math/Rotator.h" #include "Math/UnrealMathSSE.h" #include "NativeGameplayTags.h" #include "UObject/UObjectGlobals.h" #include "LyraCharacterMovementComponent.generated.h" class UObject; struct FFrame; LYRAGAME_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(TAG_Gameplay_MovementStopped); /** * FLyraCharacterGroundInfo * * Information about the ground under the character. It only gets updated as needed. */ USTRUCT(BlueprintType) struct FLyraCharacterGroundInfo { GENERATED_BODY() FLyraCharacterGroundInfo() : LastUpdateFrame(0) , GroundDistance(0.0f) {} uint64 LastUpdateFrame; UPROPERTY(BlueprintReadOnly) FHitResult GroundHitResult; UPROPERTY(BlueprintReadOnly) float GroundDistance; }; /** * ULyraCharacterMovementComponent * * The base character movement component class used by this project. */ UCLASS(Config = Game) class LYRAGAME_API ULyraCharacterMovementComponent : public UCharacterMovementComponent { GENERATED_BODY() public: ULyraCharacterMovementComponent(const FObjectInitializer& ObjectInitializer); virtual void SimulateMovement(float DeltaTime) override; virtual bool CanAttemptJump() const override; // Returns the current ground info. Calling this will update the ground info if it's out of date. UFUNCTION(BlueprintCallable, Category = "Lyra|CharacterMovement") const FLyraCharacterGroundInfo& GetGroundInfo(); void SetReplicatedAcceleration(const FVector& InAcceleration); //~UMovementComponent interface virtual FRotator GetDeltaRotation(float DeltaTime) const override; virtual float GetMaxSpeed() const override; //~End of UMovementComponent interface protected: virtual void InitializeComponent() override; protected: // Cached ground info for the character. Do not access this directly! It's only updated when accessed via GetGroundInfo(). FLyraCharacterGroundInfo CachedGroundInfo; UPROPERTY(Transient) bool bHasReplicatedAcceleration = false; };