// Copyright 2025 https://yuewu.dev/en All Rights Reserved. #pragma once #include "GMS_MovementSystemComponent.h" #include "GameFramework/Character.h" #include "GMS_CharacterMovementSystemComponent.generated.h" class UGMS_CharacterMovementSetting_Default; class UGMS_CharacterRotationSetting_Default; /** * Movement system component for characters. * 角色的运动系统组件。 */ UCLASS(ClassGroup=GMS, BlueprintType, Blueprintable, meta=(BlueprintSpawnableComponent), DisplayName="GMS Movement System Component(Character)") class GENERICMOVEMENTSYSTEM_API UGMS_CharacterMovementSystemComponent : public UGMS_MovementSystemComponent { GENERATED_BODY() public: /** * Constructor with object initializer. * 使用对象初始化器构造函数。 */ explicit UGMS_CharacterMovementSystemComponent(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get()); /** * Gets lifetime replicated properties. * 获取生命周期复制属性。 * @param OutLifetimeProps The lifetime properties. 生命周期属性。 */ virtual void GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const override; /** * Gets the character movement component. * 获取角色运动组件。 * @return The character movement component. 角色运动组件。 */ UCharacterMovementComponent* GetCharacterMovement() const { return CharacterMovement; }; protected: /** * The character movement component. * 角色运动组件。 */ UPROPERTY() TObjectPtr CharacterMovement; /** * The owning character. * 拥有该组件的角色。 */ UPROPERTY() TObjectPtr OwnerCharacter{nullptr}; /** * Maps movement modes to gameplay tags. * 将运动模式映射到游戏标签。 */ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="Settings|GameplayTags", meta=(Categories="GMS.LocomotionMode")) TMap, FGameplayTag> MovementModeToTagMapping; /** * Maps custom movement modes to gameplay tags. * 将自定义运动模式映射到游戏标签。 */ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="Settings|GameplayTags", meta=(Categories="GMS.LocomotionMode")) TMap CustomMovementModeToTagMapping; /** * Whether to apply movement settings to the character movement component. * 是否将运动设置应用于角色运动组件。 * @note Can be disabled for external control (e.g., AI). 可禁用以进行外部控制(例如AI)。 */ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="Settings|DynamicMovementState") bool bAllowRefreshCharacterMovementSettings{true}; /** * Curve mapping ground speed to movement state index (e.g., walk, jog, sprint). * 将地面速度映射到运动状态索引的曲线(例如走、慢跑、冲刺)。 */ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="Settings|DynamicMovementState", meta=(EditCondition="!bAllowRefreshCharacterMovementSettings")) TObjectPtr SpeedToMovementStateCurve; /** * 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; public: /** * 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; protected: /** * Called when the character's movement mode changes. * 角色运动模式更改时调用。 * @param InCharacter The character. 角色。 * @param PrevMovementMode The previous movement mode. 之前的运动模式。 * @param PreviousCustomMode The previous custom mode. 之前的自定义模式。 */ UFUNCTION() virtual void OnCharacterMovementModeChanged(ACharacter* InCharacter, EMovementMode PrevMovementMode, uint8 PreviousCustomMode = 0); /** * Called when the locomotion mode is replicated. * 运动模式复制时调用。 * @param PreviousLocomotionMode The previous locomotion mode. 之前的运动模式。 */ virtual void OnReplicated_LocomotionMode(const FGameplayTag& PreviousLocomotionMode) override; /** * Calculates the actual movement state. * 计算实际的运动状态。 * @return The actual movement state. 实际的运动状态。 */ virtual FGameplayTag CalculateActualMovementState(); /** * Applies the desired movement state settings to the character movement component. * 将期望的运动状态设置应用于角色运动组件。 */ virtual void ApplyMovementSetting() override; /** * Called when the rotation mode changes. * 旋转模式更改时调用。 * @param PreviousRotationMode The previous rotation mode. 之前的旋转模式。 */ virtual void OnRotationModeChanged_Implementation(const FGameplayTag& PreviousRotationMode) override; virtual void RefreshMovementBase() override; #pragma region MovementState public: /** * 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: /** * Sets the movement state. * 设置运动状态。 * @param NewMovementState The new movement state. 新运动状态。 */ virtual void SetMovementState(const FGameplayTag& NewMovementState); /** * Refreshes the movement state. * 刷新运动状态。 */ virtual void RefreshMovementState(); private: /** * Sets the desired movement state with optional RPC. * 设置期望的运动状态,可选择是否发送RPC。 * @param NewDesiredMovement The new desired movement state. 新的期望运动状态。 * @param bSendRpc Whether to send RPC. 是否发送RPC。 */ void SetDesiredMovement(const FGameplayTag& NewDesiredMovement, bool bSendRpc); /** * Client RPC to set the desired movement state. * 客户端RPC设置期望的运动状态。 * @param NewDesiredMovement The new desired movement state. 新的期望运动状态。 */ UFUNCTION(Client, Reliable) void ClientSetDesiredMovement(const FGameplayTag& NewDesiredMovement); virtual void ClientSetDesiredMovement_Implementation(const FGameplayTag& NewDesiredMovement); /** * Server RPC to set the desired movement state. * 服务器RPC设置期望的运动状态。 * @param NewDesiredMovement The new desired movement state. 新的期望运动状态。 */ UFUNCTION(Server, Reliable) void ServerSetDesiredMovement(const FGameplayTag& NewDesiredMovement); virtual void ServerSetDesiredMovement_Implementation(const FGameplayTag& NewDesiredMovement); #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: /** * Sets the rotation mode. * 设置旋转模式。 * @param NewRotationMode The new rotation mode. 新旋转模式。 */ virtual void SetRotationMode(const FGameplayTag& NewRotationMode); /** * Refreshes the rotation mode. * 刷新旋转模式。 */ virtual void RefreshRotationMode(); private: /** * Sets the desired rotation mode with optional RPC. * 设置期望的旋转模式,可选择是否发送RPC。 * @param NewDesiredRotationMode The new desired rotation mode. 新的期望旋转模式。 * @param bSendRpc Whether to send RPC. 是否发送RPC。 */ void SetDesiredRotationMode(const FGameplayTag& NewDesiredRotationMode, bool bSendRpc); /** * Client RPC to set the desired rotation mode. * 客户端RPC设置期望的旋转模式。 * @param NewDesiredRotationMode The new desired rotation mode. 新的期望旋转模式。 */ UFUNCTION(Client, Reliable) void ClientSetDesiredRotationMode(const FGameplayTag& NewDesiredRotationMode); virtual void ClientSetDesiredRotationMode_Implementation(const FGameplayTag& NewDesiredRotationMode); /** * Server RPC to set the desired rotation mode. * 服务器RPC设置期望的旋转模式。 * @param NewDesiredRotationMode The new desired rotation mode. 新的期望旋转模式。 */ UFUNCTION(Server, Reliable) void ServerSetDesiredRotationMode(const FGameplayTag& NewDesiredRotationMode); virtual void ServerSetDesiredRotationMode_Implementation(const FGameplayTag& NewDesiredRotationMode); #pragma endregion #pragma region Input public: /** * Gets the movement intent. * 获取移动意图。 * @return The movement intent vector. 移动意图向量。 */ virtual FVector GetMovementIntent() const override; /** * Sets the movement intent. * 设置移动意图。 * @param NewMovementIntent The new movement intent vector. 新移动意图向量。 */ void SetMovementIntent(FVector NewMovementIntent); protected: /** * Refreshes input handling. * 刷新输入处理。 * @param DeltaTime Time since last frame. 上一帧以来的时间。 */ virtual void RefreshInput(float DeltaTime) override; /** * Replicated movement intent. * 复制的移动意图。 */ UPROPERTY(VisibleAnywhere, Category="State|Input", Transient, Replicated) FVector_NetQuantizeNormal MovementIntent; /** * Desired movement state. * 期望的运动状态。 */ UPROPERTY(EditAnywhere, Category="Settings", Replicated, meta=(Categories="GMS.MovementState")) FGameplayTag DesiredMovementState{GMS_MovementStateTags::Jog}; /** * Desired rotation mode. * 期望的旋转模式。 */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Settings", Replicated, meta=(Categories="GMS.RotationMode")) FGameplayTag DesiredRotationMode{GMS_RotationModeTags::ViewDirection}; /** * Current movement state. * 当前的运动状态。 */ UPROPERTY(VisibleAnywhere, Category="State", Transient, meta=(Categories="GMS.MovementState")) FGameplayTag MovementState{GMS_MovementStateTags::Jog}; /** * Current rotation mode. * 当前的旋转模式。 */ UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="State", Transient, meta=(Categories="GMS.RotationMode")) FGameplayTag RotationMode{GMS_RotationModeTags::ViewDirection}; #pragma endregion #pragma region ViewSystem /** * Refreshes the view system. * 刷新视图系统。 * @param DeltaTime Time since last frame. 上一帧以来的时间。 */ virtual void RefreshView(float DeltaTime); #pragma endregion #pragma region Abstraction public: /** * 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; #pragma endregion #pragma region Locomotion protected: /** * Early refresh for locomotion. * 运动的早期刷新。 */ virtual void RefreshLocomotionEarly(); /** * Refreshes locomotion state. * 刷新运动状态。 * @param DeltaTime Time since last frame. 上一帧以来的时间。 */ virtual void RefreshLocomotion(float DeltaTime); /** * Late refresh for locomotion. * 运动的后期刷新。 * @param DeltaTime Time since last frame. 上一帧以来的时间。 */ virtual void RefreshLocomotionLate(float DeltaTime); /** * Refreshes dynamic movement state. * 刷新动态运动状态。 */ virtual void RefreshDynamicMovementState(); #pragma endregion #pragma region Rotation System public: /** * Sets rotation instantly. * 立即设置旋转。 * @param TargetYawAngle The target yaw angle. 目标偏航角。 * @param Teleport The teleport type. 传送类型。 */ UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category="GMS|MovementSystem") void SetRotationInstant(const float TargetYawAngle, const ETeleportType Teleport); /** * Sets rotation smoothly. * 平滑设置旋转。 * @param TargetYawAngle The target yaw angle. 目标偏航角。 * @param DeltaTime Time since last frame. 上一帧以来的时间。 * @param InterpolationHalfLife The rotation interpolation speed. 旋转插值速度。 */ UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category="GMS|MovementSystem") void SetRotationSmooth(float TargetYawAngle, float DeltaTime, float InterpolationHalfLife); /** * Sets rotation with extra smoothness. * 额外平滑设置旋转。 * @param TargetYawAngle The target yaw angle. 目标偏航角。 * @param DeltaTime Time since last frame. 上一帧以来的时间。 * @param InterpolationHalfLife The rotation interpolation speed. 旋转插值速度。 * @param TargetYawAngleRotationSpeed The target yaw rotation speed. 目标偏航旋转速度。 */ UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category="GMS|MovementSystem") void SetRotationExtraSmooth(float TargetYawAngle, float DeltaTime, float InterpolationHalfLife, float TargetYawAngleRotationSpeed); protected: /** * Refreshes the character's rotation. * 刷新角色的旋转。 * @param DeltaTime Time since last frame. 上一帧以来的时间。 */ UFUNCTION(BlueprintNativeEvent, Category="GMS|MovementSystem") void RefreshRotation(float DeltaTime); virtual void RefreshRotation_Implementation(float DeltaTime); /** * Refreshes grounded rotation. * 刷新地面旋转。 * @param DeltaTime Time since last frame. 上一帧以来的时间。 */ virtual void RefreshGroundedRotation(float DeltaTime); /** * Refreshes rotation when grounded and not moving. * 地面上且不移动时刷新旋转。 * @param DeltaTime Time since last frame. 上一帧以来的时间。 */ virtual void RefreshGroundedNotMovingRotation(float DeltaTime); virtual float CalculateGroundedMovingRotationInterpolationSpeed(TObjectPtr SpeedCurve, float Default = 12.0f) const; /** * Refreshes rotation when grounded and moving. * 地面上且移动时刷新旋转。 * @param DeltaTime Time since last frame. 上一帧以来的时间。 */ virtual void RefreshGroundedMovingRotation(float DeltaTime); /** * Constrains aiming rotation. * 约束瞄准旋转。 * @param ActorRotation The actor's rotation. Actor的旋转。 * @param DeltaTime Time since last frame. 上一帧以来的时间。 * @param bApplySecondaryConstraint Whether to apply secondary constraints. 是否应用次级约束。 * @return True if rotation was constrained. 如果旋转被约束返回true。 */ virtual bool ConstrainAimingRotation(FRotator& ActorRotation, float DeltaTime, bool bApplySecondaryConstraint = false); /** * Applies rotation yaw speed animation curve. * 应用旋转偏航速度动画曲线。 * @param DeltaTime Time since last frame. 上一帧以来的时间。 * @return True if the curve was applied. 如果应用了曲线返回true。 */ bool ApplyRotationYawSpeedAnimationCurve(float DeltaTime); /** * Custom rotation logic for grounded moving state. * 地面移动状态的自定义旋转逻辑。 * @param DeltaTime Time since last frame. 上一帧以来的时间。 * @return True if default rotation logic should be skipped. 如果应跳过默认旋转逻辑返回true。 */ UFUNCTION(BlueprintNativeEvent, Category="GMS|MovementSystem") bool RefreshCustomGroundedMovingRotation(float DeltaTime); /** * Custom rotation logic for grounded not moving state. * 地面不移动状态的自定义旋转逻辑。 * @param DeltaTime Time since last frame. 上一帧以来的时间。 * @return True if default rotation logic should be skipped. 如果应跳过默认旋转逻辑返回true。 */ UFUNCTION(BlueprintNativeEvent, Category="GMS|MovementSystem") bool RefreshCustomGroundedNotMovingRotation(float DeltaTime); /** * Refreshes in-air rotation. * 刷新空中旋转。 * @param DeltaTime Time since last frame. 上一帧以来的时间。 */ virtual void RefreshInAirRotation(float DeltaTime); /** * Refreshes the target yaw angle using actor's rotation. * 使用Actor的旋转刷新目标偏航角。 */ void RefreshTargetYawAngleUsingActorRotation(); /** * Sets the target yaw angle. * 设置目标偏航角。 * @param TargetYawAngle The target yaw angle. 目标偏航角。 */ void SetTargetYawAngle(float TargetYawAngle); /** * Sets the target yaw angle smoothly. * 平滑设置目标偏航角。 * @param TargetYawAngle The target yaw angle. 目标偏航角。 * @param DeltaTime Time since last frame. 上一帧以来的时间。 * @param RotationSpeed The rotation speed. 旋转速度。 */ void SetTargetYawAngleSmooth(float TargetYawAngle, float DeltaTime, float RotationSpeed); /** * Refreshes the view-relative target yaw angle. * 刷新相对于视图的目标偏航角。 */ void RefreshViewRelativeTargetYawAngle(); virtual void SetActorRotation(FRotator DesiredRotation); #pragma endregion #pragma region DistanceMatching public: /** * 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 };