Добавлен слайд (необходима доработка обрабатывания падения)

This commit is contained in:
MrTorex committed 2025-10-25 14:56:13 +03:00
1 parent ff095526bd
commit bada54c828
5 files changed
+149 -3

No files matched your search

@@ -16,6 +16,7 @@ namespace Code.Gameplay.Player
public Vector3 CameraPlanarDirection; // Направление камеры в горизонтальной плоскости
public bool JumpPressed; // Флаг указывающий, нажата ли кнопка прыжка
public bool SprintPressed; // Флаг указывающий, нажата ли кнопка спринта
public bool SlidePressed; // Флаг указывающий, нажата ли кнопка слайда
}
/*
@@ -32,8 +33,11 @@ namespace Code.Gameplay.Player
[SerializeField]
private float
maxStableMoveSpeed = 8f, // Максимальная скорость движения по устойчивой поверхности
maxStableMoveSpeed = 8f, // Максимальная скорость движения по устойчивой поверхности
sprintMoveSpeed = 12f, // Максимальная скорость спринта
slideSpeed = 20f, // Скорость слайда
slideDuration = 0.8f, // Длительность слайда в секундах
slideCooldown = 1.5f, // Время перезарядки слайда
stableMovementSharpness = 15f, // Резкость изменения скорости движения (чем выше - тем резче)
orientationSharpness = 10f, // Резкость изменения вращения персонажа (чем выше - тем резче)
jumpSpeed = 10f; // Скорость прыжка
@@ -54,6 +58,13 @@ namespace Code.Gameplay.Player
_shouldApplyCameraRotation, // Флаг указывающий, что нужно применить вращение камеры к персонажу
_jumpRequested, // Флаг указывающий, что был запрошен прыжок
_isSprinting; // Флаг указывающий, что активен режим спринта
// Переменные для управления слайдом
private bool _isSliding; // Флаг активного слайда
private float _slideTimer; // Таймер слайда
private float _slideCooldownTimer; // Таймер перезарядки слайда
private Vector3 _slideDirection; // Направление слайда
private bool _slideRequested; // Флаг запроса слайда
// Инициализация контроллера
private void Start()
@@ -65,11 +76,33 @@ namespace Code.Gameplay.Player
// Обработка и преобразование входных данных от игрока
public void SetInputs(ref PlayerInputs inputs)
{
// Обновляем таймер перезарядки слайда
if (_slideCooldownTimer > 0f)
{
_slideCooldownTimer -= Time.deltaTime;
}
// Если активен слайд - игнорируем весь остальной ввод
if (_isSliding)
{
// Во время слайда не обрабатываем движение, прыжки и спринт
_moveInputVector = Vector3.zero;
_lookInputVector = Vector3.one;
_isSprinting = false;
return;
}
// Сохраняем текущий режим камеры
_currentCameraMode = inputs.CameraMode;
// Обработка спринта
_isSprinting = inputs is { SprintPressed: true, MoveAxisForward: > 0.1f }; // Спринт только при движении вперёд
// Обработка слайда
if (inputs.SlidePressed && !_slideRequested && _slideCooldownTimer <= 0f)
{
_slideRequested = true;
}
// Нормализация вектора движения и ограничение его величины до 1
var moveInputVector =
@@ -90,6 +123,71 @@ namespace Code.Gameplay.Player
_jumpRequested = true;
}
// Начало слайда
private void StartSlide()
{
// Проверяем условия для старта слайда
if (!motor.GroundingStatus.IsStableOnGround || _slideCooldownTimer > 0f)
{
_slideRequested = false;
return;
}
_isSliding = true;
_slideTimer = slideDuration;
// НАПРАВЛЕНИЕ СЛАЙДА - ВСЕГДА ВПЕРЕД ПО КАМЕРЕ
// Используем направление камеры, но проецируем на горизонтальную плоскость
var slideDir = _currentCameraMode == CameraMode.FirstPerson ?
_firstPersonCameraRotation * Vector3.forward :
_lookInputVector;
// Проецируем на горизонтальную плоскость и нормализуем
_slideDirection = Vector3.ProjectOnPlane(slideDir, motor.CharacterUp).normalized;
// Если направление нулевое (персонаж стоит на месте), используем направление вперед
if (_slideDirection.sqrMagnitude < 0.01f)
{
_slideDirection = motor.CharacterForward;
}
// Принудительно отключаем спринт и сбрасываем прыжок во время слайда
_isSprinting = false;
_jumpRequested = false;
_slideRequested = false;
// Устанавливаем перезарядку
_slideCooldownTimer = slideCooldown;
}
// Обработка слайда
private void HandleSlide(ref Vector3 currentVelocity, float deltaTime)
{
// Уменьшаем таймер слайда
_slideTimer -= deltaTime;
// Если время слайда вышло, персонаж в воздухе - заканчиваем слайд
if (_slideTimer <= 0f || !motor.GroundingStatus.IsStableOnGround)
{
EndSlide();
return;
}
// Устанавливаем скорость слайда вперед
// Используем прямую установку скорости вместо сложных вычислений
currentVelocity = _slideDirection * slideSpeed;
// Добавляем небольшую вертикальную компоненту для лучшего скольжения по неровностям
currentVelocity += motor.CharacterUp * 2f;
}
// Завершение слайда
private void EndSlide()
{
_isSliding = false;
_slideTimer = 0f;
}
// Обработка ввода для FirstPerson режима
private void HandleFirstPersonInputs(ref PlayerInputs inputs, Vector3 moveInputVector)
{
@@ -158,6 +256,9 @@ namespace Code.Gameplay.Player
// Обновление вращения персонажа на основе входных данных
public void UpdateRotation(ref Quaternion currentRotation, float deltaTime)
{
// ВО ВРЕМЯ СЛАЙДА НЕ ОБНОВЛЯЕМ ВРАЩЕНИЕ - ПЕРСОНАЖ СМОТРИТ ПРЯМО
if (_isSliding) return;
switch (_currentCameraMode)
{
// В FirstPerson режиме применяем вращение камеры напрямую к персонажу (только горизонталь)
@@ -196,6 +297,19 @@ namespace Code.Gameplay.Player
// Обновление скорости движения персонажа
public void UpdateVelocity(ref Vector3 currentVelocity, float deltaTime)
{
// Проверяем запрос слайда и запускаем его если можно
if (_slideRequested && !_isSliding && motor.GroundingStatus.IsStableOnGround && _slideCooldownTimer <= 0f)
{
StartSlide();
}
// Если активен слайд - обрабатываем отдельно
if (_isSliding)
{
HandleSlide(ref currentVelocity, deltaTime);
return;
}
// Если персонаж находится на земле
if (motor.GroundingStatus.IsStableOnGround)
{
@@ -252,6 +366,11 @@ namespace Code.Gameplay.Player
// Метод вызывается после обработки столкновения с землей
public void PostGroundingUpdate(float deltaTime)
{
// Если во время слайда персонаж оторвался от земли - заканчиваем слайд
if (_isSliding && !motor.GroundingStatus.IsStableOnGround)
{
EndSlide();
}
}
// Метод вызывается после обновления персонажа (можно использовать для пост-обработки)
@@ -59,6 +59,7 @@ public class Player : MonoBehaviour
inputs.MoveAxisRight = moveInput.x; // Horizontal ось (A/D или Left/Right)
inputs.JumpPressed = _inputService.JumpPressed; // Прыжки (Space)
inputs.SprintPressed = _inputService.SprintPressed; // Спринт (Shift)
inputs.SlidePressed = _inputService.SlidePressed; // Слайд (Ctrl)
// Передаем информацию о камере для адаптивного поведения
inputs.CameraRotation = playerCamera.transform.rotation;
@@ -15,6 +15,7 @@ namespace Code.Input
Vector2 MoveInput { get; }
bool JumpPressed { get; }
bool SprintPressed { get; }
bool SlidePressed { get; }
// Для переключения режима камеры
bool ToggleCameraModePressed { get; }
@@ -14,6 +14,7 @@ namespace Code.Input
public Vector2 MoveInput { get; private set; }
public bool JumpPressed { get; private set; }
public bool SprintPressed { get; private set; }
public bool SlidePressed { get; private set; }
public bool ToggleCameraModePressed { get; private set; }
public InputService(InputActionAsset inputActionAsset)
@@ -74,6 +75,14 @@ namespace Code.Input
sprintAction.canceled += OnSprintCanceled;
}
// Обработка слайда (персонаж)
var slideAction = gameplayMap.FindAction("Slide");
if (slideAction != null)
{
slideAction.performed += OnSlidePerformed;
slideAction.canceled += OnSlideCanceled;
}
// Обработка переключения режима камеры
var toggleCameraModeAction = gameplayMap.FindAction("ToggleCameraMode");
if (toggleCameraModeAction != null)
@@ -132,6 +141,16 @@ namespace Code.Input
{
SprintPressed = false;
}
private void OnSlidePerformed(InputAction.CallbackContext context)
{
SlidePressed = true;
}
private void OnSlideCanceled(InputAction.CallbackContext context)
{
SlidePressed = false;
}
private void OnToggleCameraModePerformed(InputAction.CallbackContext context)
{
@@ -171,6 +190,9 @@ namespace Code.Input
gameplayMap.FindAction("Sprint").performed -= OnSprintPerformed;
gameplayMap.FindAction("Sprint").canceled -= OnSprintCanceled;
gameplayMap.FindAction("Slide").performed -= OnSlidePerformed;
gameplayMap.FindAction("Slide").canceled -= OnSlideCanceled;
gameplayMap.FindAction("ToggleCameraMode").performed -= OnToggleCameraModePerformed;
gameplayMap.FindAction("ToggleCameraMode").canceled -= OnToggleCameraModeCanceled;
}
@@ -985,8 +985,11 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Code.Gameplay.Player.CharacterController
motor: {fileID: 1696686256}
maxStableMoveSpeed: 10
sprintMoveSpeed: 15
maxStableMoveSpeed: 8
sprintMoveSpeed: 12
slideSpeed: 20
slideDuration: 0.8
slideCooldown: 1.5
stableMovementSharpness: 15
orientationSharpness: 10
jumpSpeed: 10