Инишиал добавление гравитации и прыжков, нуждается в доработке. Убраны неиспользуемые параметры
This commit is contained in:
1 parent
bd0cee77a6
commit
ee7771acd9
7 files changed
+97
-309
No files matched your search
@@ -14,6 +14,7 @@ namespace Code.Gameplay.Player
|
||||
public Quaternion CameraRotation; // Текущее вращение камеры для определения направления движения
|
||||
public CameraMode CameraMode; // Текущий режим камеры для адаптации поведения
|
||||
public Vector3 CameraPlanarDirection; // Направление камеры в горизонтальной плоскости
|
||||
public bool JumpPressed; // Флаг указывающий, нажата ли кнопка прыжка
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -32,8 +33,12 @@ namespace Code.Gameplay.Player
|
||||
private float
|
||||
maxStableMoveSpeed = 10f, // Максимальная скорость движения по устойчивой поверхности
|
||||
stableMovementSharpness = 15f, // Резкость изменения скорости движения (чем выше - тем резче)
|
||||
orientationSharpness = 10f; // Резкость изменения вращения персонажа (чем выше - тем резче)
|
||||
orientationSharpness = 10f, // Резкость изменения вращения персонажа (чем выше - тем резче)
|
||||
jumpSpeed = 10f; // Скорость прыжка
|
||||
|
||||
[SerializeField]
|
||||
private Vector3 gravity = new(0, -30f, 0); // Вектор, отвечающий за применение гравитации
|
||||
|
||||
// Векторы движения и направления взгляда
|
||||
private Vector3 _moveInputVector, _lookInputVector;
|
||||
|
||||
@@ -43,8 +48,10 @@ namespace Code.Gameplay.Player
|
||||
// Вращение камеры в FirstPerson режиме для синхронизации (только горизонтальная компонента)
|
||||
private Quaternion _firstPersonCameraRotation;
|
||||
|
||||
// Флаг указывающий, что нужно применить вращение камеры к персонажу
|
||||
private bool _shouldApplyCameraRotation;
|
||||
|
||||
private bool
|
||||
_shouldApplyCameraRotation, // Флаг указывающий, что нужно применить вращение камеры к персонажу
|
||||
_jumpRequested; // Флаг указывающий, что был запрошен прыжок
|
||||
|
||||
// Инициализация контроллера
|
||||
private void Start()
|
||||
@@ -72,6 +79,10 @@ namespace Code.Gameplay.Player
|
||||
{
|
||||
HandleThirdPersonInputs(ref inputs, moveInputVector);
|
||||
}
|
||||
|
||||
// При запрашивании прыжка
|
||||
if (inputs.JumpPressed)
|
||||
_jumpRequested = true;
|
||||
}
|
||||
|
||||
// Обработка ввода для FirstPerson режима
|
||||
@@ -180,28 +191,51 @@ namespace Code.Gameplay.Player
|
||||
// Обновление скорости движения персонажа
|
||||
public void UpdateVelocity(ref Vector3 currentVelocity, float deltaTime)
|
||||
{
|
||||
// Сохранение текущей величины скорости
|
||||
var currentVelocityMagnitude = currentVelocity.magnitude;
|
||||
|
||||
// Получение нормали поверхности для корректного движения по наклонным плоскостям
|
||||
var effectiveGroundNormal = motor.GroundingStatus.GroundNormal;
|
||||
|
||||
// Переориентация текущей скорости вдоль поверхности
|
||||
currentVelocity = motor.GetDirectionTangentToSurface(currentVelocity, effectiveGroundNormal) * currentVelocityMagnitude;
|
||||
// Если персонаж находится на земле
|
||||
if (motor.GroundingStatus.IsStableOnGround)
|
||||
{
|
||||
// Сохранение текущей величины скорости
|
||||
var currentVelocityMagnitude = currentVelocity.magnitude;
|
||||
|
||||
// Переориентация входного вектора движения вдоль поверхности
|
||||
var inputRight = Vector3.Cross(_moveInputVector, motor.CharacterUp);
|
||||
var reorientedInput = Vector3.Cross(effectiveGroundNormal, inputRight).normalized * _moveInputVector.magnitude;
|
||||
|
||||
// Расчет целевой скорости движения с учетом ограничения максимальной скорости
|
||||
var targetMovementVelocity = reorientedInput * maxStableMoveSpeed;
|
||||
|
||||
// Плавная интерполяция текущей скорости к целевой с экспоненциальным сглаживанием
|
||||
currentVelocity = Vector3.Lerp(
|
||||
currentVelocity,
|
||||
targetMovementVelocity,
|
||||
1f - Mathf.Exp(-stableMovementSharpness * deltaTime)
|
||||
);
|
||||
// Получение нормали поверхности для корректного движения по наклонным плоскостям
|
||||
var effectiveGroundNormal = motor.GroundingStatus.GroundNormal;
|
||||
|
||||
// Переориентация текущей скорости вдоль поверхности
|
||||
currentVelocity = motor.GetDirectionTangentToSurface(currentVelocity, effectiveGroundNormal) *
|
||||
currentVelocityMagnitude;
|
||||
|
||||
// Переориентация входного вектора движения вдоль поверхности
|
||||
var inputRight = Vector3.Cross(_moveInputVector, motor.CharacterUp);
|
||||
var reorientedInput = Vector3.Cross(effectiveGroundNormal, inputRight).normalized *
|
||||
_moveInputVector.magnitude;
|
||||
|
||||
// Расчет целевой скорости движения с учетом ограничения максимальной скорости
|
||||
var targetMovementVelocity = reorientedInput * maxStableMoveSpeed;
|
||||
|
||||
// Плавная интерполяция текущей скорости к целевой с экспоненциальным сглаживанием
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
// Если персонаж не находится на земле
|
||||
else
|
||||
{
|
||||
// Применяем гравитацию
|
||||
currentVelocity += gravity * deltaTime;
|
||||
// Отменяем прыжок (фикс проблемы с двойным прыжком после приземления)
|
||||
_jumpRequested = false;
|
||||
}
|
||||
}
|
||||
|
||||
// Метод вызывается перед обновлением персонажа (можно использовать для подготовки)
|
||||
|
||||
@@ -57,6 +57,7 @@ public class Player : MonoBehaviour
|
||||
var moveInput = _inputService.MoveInput;
|
||||
inputs.MoveAxisForward = moveInput.y; // Vertical ось (W/S или Up/Down)
|
||||
inputs.MoveAxisRight = moveInput.x; // Horizontal ось (A/D или Left/Right)
|
||||
inputs.JumpPressed = _inputService.JumpPressed; // Прыжки (Space)
|
||||
|
||||
// Передаем информацию о камере для адаптивного поведения
|
||||
inputs.CameraRotation = playerCamera.transform.rotation;
|
||||
|
||||
@@ -37,9 +37,6 @@ namespace Code.Gameplay.Player
|
||||
// Скорость зума камеры
|
||||
distanceMovementSpeed = 5f, // Множитель скорости изменения дистанции при зуме
|
||||
|
||||
// Скорость интерполяции текущая -> целевая позиция зума
|
||||
distanceMovementSharpness = 100f, // Коэффициент плавности изменения дистанции (чем выше - тем резче)
|
||||
|
||||
// Скорость поворота камеры
|
||||
rotationSpeed = 0.3f, // Множитель скорости вращения камеры
|
||||
|
||||
|
||||
Reference in new issue
Block a user