From c41d7f2d99aaf3d9663ef83059b164c7c97b2d66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C5=A1a=20Ceviel?= Date: Sat, 6 Dec 2025 14:37:01 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D1=81=D0=BB=D0=B0?= =?UTF-8?q?=D0=B9=D0=B4=D0=B0,=20=D0=B2=D0=BE=D0=BB=D0=BB=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B8=20=D1=82.=D0=BF.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Assets/Code/Configs/CharacterConfig.cs | 2 ++ .../Controller/Abilities/SlideMechanic.cs | 6 ++---- .../Abilities/WallRunningMechanic.cs | 21 ++++++++++++------- .../Controller/CustomCharacterController.cs | 18 +++++++++------- 4 files changed, 28 insertions(+), 19 deletions(-) diff --git a/Game/CourierOld/Assets/Code/Configs/CharacterConfig.cs b/Game/CourierOld/Assets/Code/Configs/CharacterConfig.cs index c9d9ec6..82c6e66 100644 --- a/Game/CourierOld/Assets/Code/Configs/CharacterConfig.cs +++ b/Game/CourierOld/Assets/Code/Configs/CharacterConfig.cs @@ -26,6 +26,7 @@ namespace Code.Configs ); public float slideMinVelocityThreshold = 3f, + slideInitialSpeed = 16f, slideCooldown = 1.5f, slideColliderHeightScale = 0.5f, slideCameraOffsetY = -0.5f, @@ -44,6 +45,7 @@ namespace Code.Configs public float wallRunMaxTime = 1.75f, + wallRunMaxNoMoveTime = 0.3f, wallRunSpeed = 15f, wallRunAcceleration = 25f, wallRunGravityScale = 0.25f, diff --git a/Game/CourierOld/Assets/Code/Gameplay/Character/Controller/Abilities/SlideMechanic.cs b/Game/CourierOld/Assets/Code/Gameplay/Character/Controller/Abilities/SlideMechanic.cs index 66e1ed9..38cbbcb 100644 --- a/Game/CourierOld/Assets/Code/Gameplay/Character/Controller/Abilities/SlideMechanic.cs +++ b/Game/CourierOld/Assets/Code/Gameplay/Character/Controller/Abilities/SlideMechanic.cs @@ -18,9 +18,10 @@ namespace Code.Gameplay.Character.Controller.Abilities public bool IsSliding { get; private set; } - public SlideMechanic(AnimationCurve velocityCurve, float minVelocityThreshold, float cooldown) + public SlideMechanic(AnimationCurve velocityCurve, float slideInitialSpeed, float minVelocityThreshold, float cooldown) { _velocityCurve = velocityCurve; + _initialSpeed = slideInitialSpeed; _minVelocityThreshold = minVelocityThreshold; _cooldown = cooldown; } @@ -56,9 +57,6 @@ namespace Code.Gameplay.Character.Controller.Abilities _slideDirection = Vector3.ProjectOnPlane(dir, motor.CharacterUp).normalized; if (_slideDirection.sqrMagnitude < 0.01f) _slideDirection = motor.CharacterForward; - - _initialSpeed = motor.Velocity.magnitude; - if (_initialSpeed < 12f) _initialSpeed = 12f; // fallback _cooldownTimer = _cooldown; _slideRequested = false; diff --git a/Game/CourierOld/Assets/Code/Gameplay/Character/Controller/Abilities/WallRunningMechanic.cs b/Game/CourierOld/Assets/Code/Gameplay/Character/Controller/Abilities/WallRunningMechanic.cs index 33470db..b062171 100644 --- a/Game/CourierOld/Assets/Code/Gameplay/Character/Controller/Abilities/WallRunningMechanic.cs +++ b/Game/CourierOld/Assets/Code/Gameplay/Character/Controller/Abilities/WallRunningMechanic.cs @@ -7,6 +7,7 @@ namespace Code.Gameplay.Character.Controller.Abilities public class WallRunningMechanic { private readonly float _maxWallRunTime; + private readonly float _maxWallRunNoMoveTime; private readonly float _wallRunSpeed; private readonly float _wallRunAcceleration; private readonly float _wallRunGravityScale; @@ -14,9 +15,9 @@ namespace Code.Gameplay.Character.Controller.Abilities private readonly float _wallContactAngleThreshold; private float _wallRunTimer; + private float _wallRunNoMoveTimer; private Vector3 _wallNormal; private Vector3 _wallTangentRight; - private Vector3 _wallTangentUp; private Vector3 _wallContactPoint; private Vector3 _lastMoveInputInWallSpace; @@ -29,6 +30,7 @@ namespace Code.Gameplay.Character.Controller.Abilities public WallRunningMechanic( float maxWallRunTime, + float maxWallRunNoMoveTime, float wallRunSpeed, float wallRunAcceleration, float wallRunGravityScale, @@ -36,6 +38,7 @@ namespace Code.Gameplay.Character.Controller.Abilities float wallContactAngleThreshold) { _maxWallRunTime = maxWallRunTime; + _maxWallRunNoMoveTime = maxWallRunNoMoveTime; _wallRunSpeed = wallRunSpeed; _wallRunAcceleration = wallRunAcceleration; _wallRunGravityScale = wallRunGravityScale; @@ -54,15 +57,19 @@ namespace Code.Gameplay.Character.Controller.Abilities if (!IsWallRunning) return; _wallRunTimer += deltaTime; - if (_wallRunTimer > _maxWallRunTime) - { - DetachFromWall(false); - } + _wallRunNoMoveTimer += deltaTime; + + if (!(_wallRunTimer > _maxWallRunTime) && !(_wallRunNoMoveTimer > _maxWallRunNoMoveTime)) return; + + DetachFromWall(false); + _wallRunNoMoveTimer = 0; } public bool TryStartWallRun(Vector3 hitNormal, Vector3 hitPoint) { if (IsWallRunning) return false; + + if (_motor.CharacterController is not CustomCharacterController { IsAbilitiesBlocked: false }) return false; var dotWithUp = Vector3.Dot(hitNormal, _motor.CharacterUp); var isWall = Mathf.Abs(dotWithUp) < _surfaceAngleCos; @@ -107,7 +114,6 @@ namespace Code.Gameplay.Character.Controller.Abilities } _wallTangentRight = forwardInWallPlane.normalized; - _wallTangentUp = Vector3.Cross(_wallTangentRight, -_wallNormal).normalized; _motor.ForceUnground(); } @@ -118,6 +124,7 @@ namespace Code.Gameplay.Character.Controller.Abilities if (!IsWallStillPresent()) { DetachFromWall(false); return; } var forwardInput = inputs.MoveAxisForward; + if (forwardInput != 0) _wallRunNoMoveTimer = 0f; var moveDirection = _wallTangentRight * forwardInput; var targetSpeed = moveDirection.sqrMagnitude > 0.01f ? _wallRunSpeed : currentVelocity.magnitude; @@ -202,7 +209,7 @@ namespace Code.Gameplay.Character.Controller.Abilities { if (!IsWallRunning || !_motor) return; - if (_motor.CharacterController is not CustomCharacterController { CanJump: true } controller) + if (_motor.CharacterController is not CustomCharacterController { IsAbilitiesBlocked: false } controller) return; IsWallRunning = false; diff --git a/Game/CourierOld/Assets/Code/Gameplay/Character/Controller/CustomCharacterController.cs b/Game/CourierOld/Assets/Code/Gameplay/Character/Controller/CustomCharacterController.cs index 95999ae..75fdee2 100644 --- a/Game/CourierOld/Assets/Code/Gameplay/Character/Controller/CustomCharacterController.cs +++ b/Game/CourierOld/Assets/Code/Gameplay/Character/Controller/CustomCharacterController.cs @@ -40,9 +40,9 @@ namespace Code.Gameplay.Character.Controller private bool _wasSlidingLastFrame; private float _jumpCooldownTimer; - private float _jumpCooldownDuration => _characterConfig.jumpCooldown; + private float JumpCooldownDuration => _characterConfig.jumpCooldown; - public bool CanJump => !isAbilitiesBlocked && _jumpCooldownTimer <= 0f; + public bool CanJump => _jumpCooldownTimer <= 0f; // Подсистемы private CharacterInputHandler _inputHandler; @@ -59,8 +59,8 @@ namespace Code.Gameplay.Character.Controller public bool IsWallRunning => _wallRunningMechanic.IsWallRunning; private float abilityBlockTimer; - private bool isAbilitiesBlocked; - + public bool IsAbilitiesBlocked { get; private set; } + private CharacterInputs _lastInputs; public void SetPosition(Vector3 position) => motor.SetPosition(position); @@ -79,11 +79,13 @@ namespace Code.Gameplay.Character.Controller ); _slideMechanic = new SlideMechanic( _characterConfig.slideVelocityCurve, + _characterConfig.slideInitialSpeed, _characterConfig.slideMinVelocityThreshold, _characterConfig.slideCooldown ); _wallRunningMechanic = new WallRunningMechanic( _characterConfig.wallRunMaxTime, + _characterConfig.wallRunMaxNoMoveTime, _characterConfig.wallRunSpeed, _characterConfig.wallRunAcceleration, _characterConfig.wallRunGravityScale, @@ -142,12 +144,12 @@ namespace Code.Gameplay.Character.Controller _currentCameraMode = inputs.CameraMode; - if (isAbilitiesBlocked) + if (IsAbilitiesBlocked) { abilityBlockTimer -= Time.deltaTime; if (abilityBlockTimer <= 0) { - isAbilitiesBlocked = false; + IsAbilitiesBlocked = false; } else { @@ -277,7 +279,7 @@ namespace Code.Gameplay.Character.Controller public void BlockAbilities(float duration) { - isAbilitiesBlocked = true; + IsAbilitiesBlocked = true; abilityBlockTimer = duration; } @@ -380,7 +382,7 @@ namespace Code.Gameplay.Character.Controller public void TriggerJump() { - _jumpCooldownTimer = _jumpCooldownDuration; + _jumpCooldownTimer = JumpCooldownDuration; } public void BeforeCharacterUpdate(float deltaTime)