From ff095526bd0aad19af63bba4487736cf7e9200a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C5=A1a=20Ceviel?= <39222425+MrTorex@users.noreply.github.com> Date: Sat, 25 Oct 2025 11:03:52 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D1=81=D0=BF=D1=80=D0=B8=D0=BD=D1=82,=20=D0=B8=D0=B7?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D1=8B=20=D0=BF=D0=B0=D1=80=D0=B0?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D1=80=D1=8B=20=D1=81=D0=BA=D0=BE=D1=80=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=B8=20=D0=BF=D0=B5=D1=80=D1=81=D0=BE=D0=BD=D0=B0?= =?UTF-8?q?=D0=B6=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Gameplay/Player/CharacterController.cs | 18 ++++++++++----- .../Assets/Code/Gameplay/Player/Player.cs | 1 + .../Assets/Code/Input/IInputService.cs | 1 + .../Assets/Code/Input/InputService.cs | 22 +++++++++++++++++++ .../Assets/Resources/Scenes/MovementDev.unity | 2 +- 5 files changed, 37 insertions(+), 7 deletions(-) diff --git a/Game/CourierOld/Assets/Code/Gameplay/Player/CharacterController.cs b/Game/CourierOld/Assets/Code/Gameplay/Player/CharacterController.cs index d4ae4f5..48bfc45 100644 --- a/Game/CourierOld/Assets/Code/Gameplay/Player/CharacterController.cs +++ b/Game/CourierOld/Assets/Code/Gameplay/Player/CharacterController.cs @@ -15,6 +15,7 @@ namespace Code.Gameplay.Player public CameraMode CameraMode; // Текущий режим камеры для адаптации поведения public Vector3 CameraPlanarDirection; // Направление камеры в горизонтальной плоскости public bool JumpPressed; // Флаг указывающий, нажата ли кнопка прыжка + public bool SprintPressed; // Флаг указывающий, нажата ли кнопка спринта } /* @@ -31,7 +32,8 @@ namespace Code.Gameplay.Player [SerializeField] private float - maxStableMoveSpeed = 10f, // Максимальная скорость движения по устойчивой поверхности + maxStableMoveSpeed = 8f, // Максимальная скорость движения по устойчивой поверхности + sprintMoveSpeed = 12f, // Максимальная скорость спринта stableMovementSharpness = 15f, // Резкость изменения скорости движения (чем выше - тем резче) orientationSharpness = 10f, // Резкость изменения вращения персонажа (чем выше - тем резче) jumpSpeed = 10f; // Скорость прыжка @@ -48,10 +50,10 @@ namespace Code.Gameplay.Player // Вращение камеры в FirstPerson режиме для синхронизации (только горизонтальная компонента) private Quaternion _firstPersonCameraRotation; - private bool - _shouldApplyCameraRotation, // Флаг указывающий, что нужно применить вращение камеры к персонажу - _jumpRequested; // Флаг указывающий, что был запрошен прыжок + _shouldApplyCameraRotation, // Флаг указывающий, что нужно применить вращение камеры к персонажу + _jumpRequested, // Флаг указывающий, что был запрошен прыжок + _isSprinting; // Флаг указывающий, что активен режим спринта // Инициализация контроллера private void Start() @@ -65,6 +67,9 @@ namespace Code.Gameplay.Player { // Сохраняем текущий режим камеры _currentCameraMode = inputs.CameraMode; + + // Обработка спринта + _isSprinting = inputs is { SprintPressed: true, MoveAxisForward: > 0.1f }; // Спринт только при движении вперёд // Нормализация вектора движения и ограничение его величины до 1 var moveInputVector = @@ -209,8 +214,9 @@ namespace Code.Gameplay.Player var reorientedInput = Vector3.Cross(effectiveGroundNormal, inputRight).normalized * _moveInputVector.magnitude; - // Расчет целевой скорости движения с учетом ограничения максимальной скорости - var targetMovementVelocity = reorientedInput * maxStableMoveSpeed; + // Расчет целевой скорости движения с учетом ограничения максимальной скорости и спринта + var targetSpeed = _isSprinting ? sprintMoveSpeed : maxStableMoveSpeed; + var targetMovementVelocity = reorientedInput * targetSpeed; // Плавная интерполяция текущей скорости к целевой с экспоненциальным сглаживанием currentVelocity = Vector3.Lerp( diff --git a/Game/CourierOld/Assets/Code/Gameplay/Player/Player.cs b/Game/CourierOld/Assets/Code/Gameplay/Player/Player.cs index 350ddbe..68b3386 100644 --- a/Game/CourierOld/Assets/Code/Gameplay/Player/Player.cs +++ b/Game/CourierOld/Assets/Code/Gameplay/Player/Player.cs @@ -58,6 +58,7 @@ public class Player : MonoBehaviour inputs.MoveAxisForward = moveInput.y; // Vertical ось (W/S или Up/Down) inputs.MoveAxisRight = moveInput.x; // Horizontal ось (A/D или Left/Right) inputs.JumpPressed = _inputService.JumpPressed; // Прыжки (Space) + inputs.SprintPressed = _inputService.SprintPressed; // Спринт (Shift) // Передаем информацию о камере для адаптивного поведения inputs.CameraRotation = playerCamera.transform.rotation; diff --git a/Game/CourierOld/Assets/Code/Input/IInputService.cs b/Game/CourierOld/Assets/Code/Input/IInputService.cs index 4dd0357..bb74a07 100644 --- a/Game/CourierOld/Assets/Code/Input/IInputService.cs +++ b/Game/CourierOld/Assets/Code/Input/IInputService.cs @@ -14,6 +14,7 @@ namespace Code.Input // Для управления движением персонажа Vector2 MoveInput { get; } bool JumpPressed { get; } + bool SprintPressed { get; } // Для переключения режима камеры bool ToggleCameraModePressed { get; } diff --git a/Game/CourierOld/Assets/Code/Input/InputService.cs b/Game/CourierOld/Assets/Code/Input/InputService.cs index 38e77f8..eda443d 100644 --- a/Game/CourierOld/Assets/Code/Input/InputService.cs +++ b/Game/CourierOld/Assets/Code/Input/InputService.cs @@ -13,6 +13,7 @@ namespace Code.Input public float ZoomInput { get; private set; } public Vector2 MoveInput { get; private set; } public bool JumpPressed { get; private set; } + public bool SprintPressed { get; private set; } public bool ToggleCameraModePressed { get; private set; } public InputService(InputActionAsset inputActionAsset) @@ -65,6 +66,14 @@ namespace Code.Input jumpAction.canceled += OnJumpCanceled; } + // Обработка спринта (персонаж) + var sprintAction = gameplayMap.FindAction("Sprint"); + if (sprintAction != null) + { + sprintAction.performed += OnSprintPerformed; + sprintAction.canceled += OnSprintCanceled; + } + // Обработка переключения режима камеры var toggleCameraModeAction = gameplayMap.FindAction("ToggleCameraMode"); if (toggleCameraModeAction != null) @@ -113,6 +122,16 @@ namespace Code.Input { JumpPressed = false; } + + private void OnSprintPerformed(InputAction.CallbackContext context) + { + SprintPressed = true; + } + + private void OnSprintCanceled(InputAction.CallbackContext context) + { + SprintPressed = false; + } private void OnToggleCameraModePerformed(InputAction.CallbackContext context) { @@ -149,6 +168,9 @@ namespace Code.Input gameplayMap.FindAction("Jump").performed -= OnJumpPerformed; gameplayMap.FindAction("Jump").canceled -= OnJumpCanceled; + gameplayMap.FindAction("Sprint").performed -= OnSprintPerformed; + gameplayMap.FindAction("Sprint").canceled -= OnSprintCanceled; + gameplayMap.FindAction("ToggleCameraMode").performed -= OnToggleCameraModePerformed; gameplayMap.FindAction("ToggleCameraMode").canceled -= OnToggleCameraModeCanceled; } diff --git a/Game/CourierOld/Assets/Resources/Scenes/MovementDev.unity b/Game/CourierOld/Assets/Resources/Scenes/MovementDev.unity index 1197926..35d0e2c 100644 --- a/Game/CourierOld/Assets/Resources/Scenes/MovementDev.unity +++ b/Game/CourierOld/Assets/Resources/Scenes/MovementDev.unity @@ -362,7 +362,6 @@ MonoBehaviour: minDistance: 3 maxDistance: 10 distanceMovementSpeed: 5 - distanceMovementSharpness: 100 rotationSpeed: 0.3 rotationSharpness: 100 followSharpness: 100 @@ -987,6 +986,7 @@ MonoBehaviour: m_EditorClassIdentifier: Assembly-CSharp::Code.Gameplay.Player.CharacterController motor: {fileID: 1696686256} maxStableMoveSpeed: 10 + sprintMoveSpeed: 15 stableMovementSharpness: 15 orientationSharpness: 10 jumpSpeed: 10