Перенос всех магических чисел в градусы

This commit is contained in:
MrTorex committed 2025-10-29 12:11:03 +03:00
1 parent fb85b22e96
commit 07ce27618c
5 files changed
+39 -13

No files matched your search

@@ -13,12 +13,16 @@ namespace Code.Gameplay.Character.Controller.Abilities
private readonly float _wallClimbSpeedFactor;
// Минимальная горизонтальная скорость для начала залазания на стену
private readonly float _minWallClimbSpeed;
// Пороговый косинус стены
private readonly float _wallNormalThreshold;
// Конструктор механики залазания на стену
public WallClimbMechanic(float wallClimbSpeedFactor, float minWallClimbSpeed)
public WallClimbMechanic(float wallClimbSpeedFactor, float minWallClimbSpeed, float wallDetectionAngleThreshold)
{
_wallClimbSpeedFactor = wallClimbSpeedFactor;
_minWallClimbSpeed = minWallClimbSpeed;
// Преобразуем угол в косинус порога: если |dot| > cos(threshold), то это НЕ стена
_wallNormalThreshold = Mathf.Cos(Mathf.Deg2Rad * wallDetectionAngleThreshold);
}
// Обработка столкновения при движении (вызывается при ударе о препятствие)
@@ -26,7 +30,7 @@ namespace Code.Gameplay.Character.Controller.Abilities
{
// Проверяем, что это вертикальная или почти вертикальная поверхность (стена)
var dotWithUp = Vector3.Dot(hitNormal, motor.CharacterUp);
if (Mathf.Abs(dotWithUp) > 0.1f) return; // Не стена — это пол или потолок
if (Mathf.Abs(dotWithUp) > _wallNormalThreshold) return; // Не стена — это пол или потолок
// Получаем текущую скорость персонажа
var currentVelocity = motor.Velocity;
@@ -35,7 +35,9 @@ namespace Code.Gameplay.Character.Controller
private void Awake()
{
// Инициализация подсистем с параметрами из конфига
_inputHandler = new CharacterInputHandler();
_inputHandler = new CharacterInputHandler(
_characterConfig.sprintAngleThreshold
);
_slideMechanic = new SlideMechanic(
_characterConfig.slideSpeed,
_characterConfig.slideDuration,
@@ -43,7 +45,8 @@ namespace Code.Gameplay.Character.Controller
);
_wallClimbMechanic = new WallClimbMechanic(
_characterConfig.wallClimbSpeedFactor,
_characterConfig.minWallClimbSpeed
_characterConfig.minWallClimbSpeed,
_characterConfig.wallDetectionAngleThreshold
);
_groundMovement = new GroundMovementSystem(
_characterConfig.maxStableMoveSpeed,
@@ -11,6 +11,9 @@ namespace Code.Gameplay.Character.Controller.Input
*/
public class CharacterInputHandler
{
// Косинус порогового угла для спринта (предвычислен)
private readonly float _sprintAngleThresholdCos;
// Векторы движения и направления взгляда
public Vector3 MoveInputVector { get; set; }
public Vector3 LookInputVector { get; set; }
@@ -23,7 +26,16 @@ namespace Code.Gameplay.Character.Controller.Input
// Флаг-свойство указывающий, что нужно применить вращение камеры к персонажу
public bool ShouldApplyCameraRotation { get; private set; }
// Конструктор с пороговым углом
public CharacterInputHandler(float sprintAngleThreshold)
{
// Предвычисляем косинус порогового угла для эффективности
// Угол в градусах → радианы → косинус
// Чем меньше угол — тем строже условие
_sprintAngleThresholdCos = Mathf.Cos(Mathf.Deg2Rad * sprintAngleThreshold);
}
// Обработка и преобразование входных данных от персонажа
public void ProcessInputs(ref CharacterInputs inputs, KinematicCharacterMotor motor)
{
@@ -31,7 +43,7 @@ namespace Code.Gameplay.Character.Controller.Input
var currentCameraMode = inputs.CameraMode;
// Обработка спринта
IsSprinting = inputs is { SprintPressed: true, MoveAxisForward: > 0.1f }; // Спринт только при движении вперёд
IsSprinting = inputs.SprintPressed && inputs.MoveAxisForward > _sprintAngleThresholdCos; // Спринт только при движении на заданный в конфиге угол
// Нормализация вектора движения и ограничение его величины до 1
var moveInputVector =