Files
PGiZ3/Assets/Code/Gameplay/Character/Controller/GroundMovementSystem.cs
T
2026-02-23 12:05:54 +03:00

72 lines
2.6 KiB
C#

using UnityEngine;
using KinematicCharacterController;
namespace Code.Gameplay.Character.Controller
{
public class GroundMovementSystem
{
private readonly float _maxStableMoveSpeed;
private readonly float _sprintMoveSpeed;
private readonly float _stableMovementSharpness;
private readonly float _jumpSpeed;
public bool JumpRequested { get; private set; }
public GroundMovementSystem(float maxStableMoveSpeed, float sprintMoveSpeed, float stableMovementSharpness, float jumpSpeed)
{
_maxStableMoveSpeed = maxStableMoveSpeed;
_sprintMoveSpeed = sprintMoveSpeed;
_stableMovementSharpness = stableMovementSharpness;
_jumpSpeed = jumpSpeed;
}
public void RequestJump(bool jumpPressed)
{
if (jumpPressed)
JumpRequested = true;
}
public void CancelJumpRequest()
{
JumpRequested = false;
}
public void UpdateVelocity(
ref Vector3 currentVelocity,
CharacterInputHandler inputHandler,
KinematicCharacterMotor motor,
float deltaTime)
{
var currentVelocityMagnitude = currentVelocity.magnitude;
var effectiveGroundNormal = motor.GroundingStatus.GroundNormal;
currentVelocity = motor.GetDirectionTangentToSurface(currentVelocity, effectiveGroundNormal) *
currentVelocityMagnitude;
var inputRight = Vector3.Cross(inputHandler.MoveInputVector, motor.CharacterUp);
var reorientedInput = Vector3.Cross(effectiveGroundNormal, inputRight).normalized *
inputHandler.MoveInputVector.magnitude;
var targetSpeed = inputHandler.IsSprinting ? _sprintMoveSpeed : _maxStableMoveSpeed;
var targetMovementVelocity = reorientedInput * targetSpeed;
currentVelocity = Vector3.Lerp(
currentVelocity,
targetMovementVelocity,
1f - Mathf.Exp(-_stableMovementSharpness * deltaTime)
);
if (JumpRequested)
{
currentVelocity += motor.CharacterUp * _jumpSpeed - Vector3.Project(currentVelocity, motor.CharacterUp);
JumpRequested = false;
motor.ForceUnground();
if (motor.CharacterController is CustomCharacterController controller)
{
controller.TriggerJump();
}
}
}
}
}