Files
PHY/Plugins/GMS/Source/GenericMovementSystem/Public/GMS_MoverMovementSystemComponent.h
2026-03-03 01:23:02 +08:00

547 lines
16 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Copyright 2025 https://yuewu.dev/en All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "GMS_MovementSystemComponent.h"
#include "MoverSimulationTypes.h"
#include "GMS_MoverMovementSystemComponent.generated.h"
class UMoverTrajectoryPredictor;
class UNavMoverComponent;
class UGMS_InputProducer;
/**
* Movement system component for mover-based movement (work in progress).
* 基于Mover的运动系统组件开发中
* @note Not recommended for use until production ready. 在标记为生产就绪之前不建议使用。
*/
UCLASS(ClassGroup=GMS, BlueprintType, Blueprintable, meta=(BlueprintSpawnableComponent), DisplayName="GMS Movement System Component(Mover)")
class GENERICMOVEMENTSYSTEM_API UGMS_MoverMovementSystemComponent : public UGMS_MovementSystemComponent, public IMoverInputProducerInterface
{
GENERATED_BODY()
public:
/**
* Constructor with object initializer.
* 使用对象初始化器构造函数。
*/
UGMS_MoverMovementSystemComponent(const FObjectInitializer& ObjectInitializer);
/**
* Gets lifetime replicated properties.
* 获取生命周期复制属性。
* @param OutLifetimeProps The lifetime properties. 生命周期属性。
*/
virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
/**
* Produces input for the mover simulation.
* 为Mover模拟生成输入。
* @param SimTimeMs Simulation time in milliseconds. 模拟时间(毫秒)。
* @param InputCmdResult The input command context (output). 输入命令上下文(输出)。
*/
virtual void ProduceInput_Implementation(int32 SimTimeMs, FMoverInputCmdContext& InputCmdResult) override;
/**
* Called every frame.
* 每帧调用。
* @param DeltaTime Time since last frame. 上一帧以来的时间。
* @param TickType The type of tick. tick类型。
* @param ThisTickFunction The tick function. tick函数。
*/
virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
/**
* Called before the mover simulation tick.
* Mover模拟tick前调用。
* @param TimeStep The mover time step. Mover时间步。
* @param InputCmd The input command context. 输入命令上下文。
*/
UFUNCTION()
virtual void OnMoverPreSimulationTick(const FMoverTimeStep& TimeStep, const FMoverInputCmdContext& InputCmd);
protected:
/**
* The mover component.
* Mover组件。
*/
UPROPERTY()
TObjectPtr<UMoverComponent> MoverComponent{nullptr};
UPROPERTY()
TObjectPtr<UMoverTrajectoryPredictor> TrajectoryPredictor{nullptr};
/**
* The skeletal mesh component.
* 骨骼网格组件。
*/
UPROPERTY()
TObjectPtr<USkeletalMeshComponent> MeshComponent{nullptr};
/**
* Handles navigation movement data and functions.
* 处理导航运动数据和函数。
*/
UPROPERTY()
TObjectPtr<UNavMoverComponent> NavMoverComponent{nullptr};
/**
* Maps movement modes to gameplay tags.
* 将运动模式映射到游戏标签。
*/
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="Settings|GameplayTags", meta=(Categories="GMS.LocomotionMode"))
TMap<FName, FGameplayTag> MovementModeToTagMapping;
/**
* Initializes the component.
* 初始化组件。
*/
virtual void InitializeComponent() override;
/**
* Called when the game starts.
* 游戏开始时调用。
*/
virtual void BeginPlay() override;
/**
* Called when the game ends.
* 游戏结束时调用。
* @param EndPlayReason The reason for ending. 结束原因。
*/
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
/**
* Handle for the movement state modifier (e.g., crouching).
* 运动状态修饰符的句柄(例如蹲伏)。
*/
FMovementModifierHandle MovementStateModiferHandle;
/**
* Called when the mover movement mode changes.
* Mover运动模式更改时调用。
* @param PreviousMovementModeName The previous movement mode name. 之前的运动模式名称。
* @param NewMovementModeName The new movement mode name. 新运动模式名称。
*/
UFUNCTION()
virtual void OnMoverMovementModeChanged(const FName& PreviousMovementModeName, const FName& NewMovementModeName);
/**
* Applies movement settings.
* 应用运动设置。
*/
virtual void ApplyMovementSetting() override;
#pragma region ViewSystem
/**
* Refreshes the view system.
* 刷新视图系统。
* @param DeltaTime Time since last frame. 上一帧以来的时间。
*/
virtual void RefreshView(float DeltaTime);
/**
* Server RPC to set replicated view rotation.
* 服务器RPC设置复制的视图旋转。
* @param NewViewRotation The new view rotation. 新视图旋转。
*/
virtual void ServerSetReplicatedViewRotation_Implementation(const FRotator& NewViewRotation) override;
#pragma endregion
#pragma region Locomotion
public:
virtual TScriptInterface<IPoseSearchTrajectoryPredictorInterface> GetTrajectoryPredictor() const override;
/**
* Checks if the character is crouching.
* 检查角色是否在蹲伏。
* @return True if crouching. 如果在蹲伏返回true。
*/
virtual bool IsCrouching() const override;
/**
* Gets the maximum speed.
* 获取最大速度。
* @return The maximum speed. 最大速度。
*/
virtual float GetMaxSpeed() const override;
/**
* Gets the scaled capsule radius.
* 获取缩放的胶囊体半径。
* @return The capsule radius. 胶囊体半径。
*/
virtual float GetScaledCapsuleRadius() const override;
/**
* Gets the scaled capsule half height.
* 获取缩放的胶囊体半高。
* @return The capsule half height. 胶囊体半高。
*/
virtual float GetScaledCapsuleHalfHeight() const override;
/**
* Gets the maximum acceleration.
* 获取最大加速度。
* @return The maximum acceleration. 最大加速度。
*/
virtual float GetMaxAcceleration() const override;
/**
* Gets the maximum braking deceleration.
* 获取最大制动减速度。
* @return The maximum braking deceleration. 最大制动减速度。
*/
virtual float GetMaxBrakingDeceleration() const override;
/**
* Gets the walkable floor Z value.
* 获取可行走地面Z值。
* @return The walkable floor Z. 可行走地面Z值。
*/
virtual float GetWalkableFloorZ() const override;
/**
* Gets the gravity Z value.
* 获取重力Z值。
* @return The gravity Z. 重力Z值。
*/
virtual float GetGravityZ() const override;
/**
* Gets the skeletal mesh component.
* 获取骨骼网格组件。
* @return The skeletal mesh component. 骨骼网格组件。
*/
virtual USkeletalMeshComponent* GetMesh() const override;
virtual bool IsMovingOnGround() const override;
protected:
/**
* Early refresh for locomotion.
* 运动的早期刷新。
*/
virtual void RefreshLocomotionEarly();
/**
* Refreshes locomotion state.
* 刷新运动状态。
* @param DeltaTime Time since last frame. 上一帧以来的时间。
*/
virtual void RefreshLocomotion(float DeltaTime);
/**
* Refreshes dynamic movement state.
* 刷新动态运动状态。
*/
virtual void RefreshDynamicMovementState();
/**
* Late refresh for locomotion.
* 运动的后期刷新。
* @param DeltaTime Time since last frame. 上一帧以来的时间。
*/
virtual void RefreshLocomotionLate(float DeltaTime);
#pragma endregion
#pragma region Rotation System
public:
/**
* Refreshes the target yaw angle using locomotion rotation.
* 使用运动旋转刷新目标偏航角。
*/
void RefreshTargetYawAngleUsingActorRotation();
/**
* Sets the target yaw angle.
* 设置目标偏航角。
* @param TargetYawAngle The target yaw angle. 目标偏航角。
*/
void SetTargetYawAngle(float TargetYawAngle);
/**
* Refreshes the view-relative target yaw angle.
* 刷新相对于视图的目标偏航角。
*/
void RefreshViewRelativeTargetYawAngle();
#pragma endregion
#pragma region DistanceMatching
/**
* Gets parameters for predicting ground movement pivot location.
* 获取预测地面运动枢轴位置的参数。
* @return The pivot location parameters. 枢轴位置参数。
*/
virtual FGMS_PredictGroundMovementPivotLocationParams GetPredictGroundMovementPivotLocationParams() const override;
/**
* Gets parameters for predicting ground movement stop location.
* 获取预测地面运动停止位置的参数。
* @return The stop location parameters. 停止位置参数。
*/
virtual FGMS_PredictGroundMovementStopLocationParams GetPredictGroundMovementStopLocationParams() const override;
#pragma endregion
#pragma region MovementState
virtual void RefreshMovementBase() override;
/**
* Gets the desired movement state.
* 获取期望的运动状态。
* @return The desired movement state. 期望的运动状态。
*/
virtual const FGameplayTag& GetDesiredMovementState() const override;
/**
* Sets the desired movement state.
* 设置期望的运动状态。
* @param NewDesiredMovement The new desired movement state. 新的期望运动状态。
*/
virtual void SetDesiredMovement(const FGameplayTag& NewDesiredMovement) override;
/**
* Gets the current movement state.
* 获取当前的运动状态。
* @return The current movement state. 当前的运动状态。
*/
virtual const FGameplayTag& GetMovementState() const override;
protected:
/**
* Applies the movement state and related settings.
* 应用运动状态及相关设置。
* @param NewMovementState The new movement state. 新运动状态。
*/
virtual void ApplyMovementState(const FGameplayTag& NewMovementState);
#pragma endregion
#pragma region RotationMode
public:
/**
* Gets the desired rotation mode.
* 获取期望的旋转模式。
* @return The desired rotation mode. 期望的旋转模式。
*/
virtual const FGameplayTag& GetDesiredRotationMode() const override;
/**
* Sets the desired rotation mode.
* 设置期望的旋转模式。
* @param NewDesiredRotationMode The new desired rotation mode. 新的期望旋转模式。
*/
virtual void SetDesiredRotationMode(const FGameplayTag& NewDesiredRotationMode) override;
/**
* Gets the current rotation mode.
* 获取当前的旋转模式。
* @return The current rotation mode. 当前的旋转模式。
*/
virtual const FGameplayTag& GetRotationMode() const override;
protected:
/**
* Applies the rotation mode and related settings.
* 应用旋转模式及相关设置。
* @param NewRotationMode The new rotation mode. 新旋转模式。
*/
virtual void ApplyRotationMode(const FGameplayTag& NewRotationMode);
#pragma endregion
#pragma region Input
/**
* Requests movement with an intended directional magnitude.
* 请求以指定方向强度移动。
* @param DesiredIntent The desired movement intent. 期望的移动意图。
*/
UFUNCTION(BlueprintCallable, Category="GMS|MovementSystem")
virtual void RequestMoveByIntent(const FVector& DesiredIntent) { CachedMoveInputIntent = DesiredIntent; }
/**
* Requests movement with a desired velocity.
* 请求以指定速度移动。
* @param DesiredVelocity The desired velocity. 期望的速度。
*/
UFUNCTION(BlueprintCallable, Category="GMS|MovementSystem")
virtual void RequestMoveByVelocity(const FVector& DesiredVelocity) { CachedMoveInputVelocity = DesiredVelocity; }
/**
* Clears movement requests.
* 清除移动请求。
*/
UFUNCTION(BlueprintCallable, Category="GMS|MovementSystem")
virtual void ClearMoveRequest()
{
CachedMoveInputIntent = FVector::ZeroVector;
CachedMoveInputVelocity = FVector::ZeroVector;
}
/**
* Gets the movement intent.
* 获取移动意图。
* @return The movement intent vector. 移动意图向量。
*/
virtual FVector GetMovementIntent() const override;
/**
* Produces input for the simulation frame.
* 为模拟帧生成输入。
* @param DeltaMs Time delta in milliseconds. 时间增量(毫秒)。
* @param InputCmd The input command context. 输入命令上下文。
* @return The produced input command context. 生成的输入命令上下文。
*/
UFUNCTION(BlueprintNativeEvent, Category="GMS|MovementSystem")
FMoverInputCmdContext OnProduceInput(float DeltaMs, FMoverInputCmdContext InputCmd);
/**
* Adjusts orientation intent based on context.
* 根据上下文调整方向意图。
* @param DeltaSeconds Time since last frame. 上一帧以来的时间。
* @param OrientationIntent The orientation intent. 方向意图。
* @return The adjusted orientation intent. 调整后的方向意图。
*/
virtual FVector AdjustOrientationIntent(float DeltaSeconds, const FVector& OrientationIntent) const;
/**
* Whether to use base-relative movement.
* 是否使用基于基础的移动。
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Settings|Input")
bool bUseBaseRelativeMovement = true;
/**
* Whether to maintain the last input orientation after input ceases.
* 输入停止后是否保持最后输入方向。
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Settings|Input")
bool bMaintainLastInputOrientation = false;
/**
* Last non-zero movement input.
* 最后非零移动输入。
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="State|Input")
FVector LastAffirmativeMoveInput = FVector::ZeroVector;
/**
* If true, the actor will remain vertical despite any rotation applied to the actor
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=MoverExamples)
bool bShouldRemainVertical = true;
/**
* Cached movement input intent.
* 缓存的移动输入意图。
*/
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="State|Input")
FVector CachedMoveInputIntent = FVector::ZeroVector;
/**
* Cached movement input velocity.
* 缓存的移动输入速度。
*/
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="State|Input")
FVector CachedMoveInputVelocity = FVector::ZeroVector;
/**
* Cached turn input.
* 缓存的转向输入。
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="State|Input")
FRotator CachedTurnInput = FRotator::ZeroRotator;
/**
* Cached look input.
* 缓存的观察输入。
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="State|Input")
FRotator CachedLookInput = FRotator::ZeroRotator;
/**
* Current desired movement state.
* 当前期望的运动状态。
*/
UPROPERTY(EditAnywhere, Category="State|Input", meta=(Categories="GMS.MovementState"))
FGameplayTag DesiredMovementState{GMS_MovementStateTags::Jog};
/**
* Current desired rotation mode.
* 当前期望的旋转模式。
*/
UPROPERTY(EditAnywhere, Category="Settings", meta=(Categories="GMS.RotationMode"))
FGameplayTag DesiredRotationMode{GMS_RotationModeTags::ViewDirection};
/**
* Current movement state.
* 当前的运动状态。
*/
UPROPERTY(VisibleAnywhere, Category="State", ReplicatedUsing=OnMovementStateChanged, meta=(Categories="GMS.MovementState"))
FGameplayTag MovementState{GMS_MovementStateTags::Jog};
/**
* Current rotation mode.
* 当前的旋转模式。
*/
UPROPERTY(VisibleAnywhere, Category="State", ReplicatedUsing=OnRotationModeChanged, meta=(Categories="GMS.RotationMode"))
FGameplayTag RotationMode{GMS_RotationModeTags::ViewDirection};
public:
/**
* Whether the jump input was just pressed.
* 跳跃输入是否刚被按下。
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="State|Input")
bool bIsJumpJustPressed = false;
/**
* Whether the jump input is held.
* 跳跃输入是否被持续按住。
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="State|Input")
bool bIsJumpPressed = false;
/**
* Input tags for the component.
* 组件的输入标签。
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient, Category="State|Input")
FGameplayTagContainer InputTags;
/**
* Whether flying is active.
* 飞行是否激活。
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="State|Input")
bool bIsFlyingActive = false;
/**
* Whether to toggle flying.
* 是否切换飞行状态。
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="State|Input")
bool bShouldToggleFlying = false;
private:
/**
* Flag indicating if input is produced in Blueprint.
* 指示是否在蓝图中生成输入的标志。
*/
uint8 bHasProduceInputInBpFunc : 1;
#pragma endregion
#if WITH_EDITOR
/**
* Validates data in the editor.
* 在编辑器中验证数据。
* @param Context The validation context. 验证上下文。
* @return The validation result. 验证结果。
*/
virtual EDataValidationResult IsDataValid(class FDataValidationContext& Context) const override;
#endif
};