From ec8d233189670e8f07779b82d8735c69cbcc2654 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C5=A1a=20Ceviel?= Date: Mon, 23 Feb 2026 12:05:54 +0300 Subject: [PATCH] added jumps --- .../Controller/GroundMovementSystem.cs | 28 ++++++++++++++- .../Character/Core/CharacterProvider.cs | 1 + .../Core/CustomCharacterController.cs | 34 +++++++++++++++++-- Assets/Resources/Scenes/Gameplay.unity | 2 ++ 4 files changed, 61 insertions(+), 4 deletions(-) diff --git a/Assets/Code/Gameplay/Character/Controller/GroundMovementSystem.cs b/Assets/Code/Gameplay/Character/Controller/GroundMovementSystem.cs index b4b4095..f80e4f0 100644 --- a/Assets/Code/Gameplay/Character/Controller/GroundMovementSystem.cs +++ b/Assets/Code/Gameplay/Character/Controller/GroundMovementSystem.cs @@ -8,12 +8,26 @@ namespace Code.Gameplay.Character.Controller private readonly float _maxStableMoveSpeed; private readonly float _sprintMoveSpeed; private readonly float _stableMovementSharpness; + private readonly float _jumpSpeed; + public bool JumpRequested { get; private set; } - public GroundMovementSystem(float maxStableMoveSpeed, float sprintMoveSpeed, float stableMovementSharpness) + public GroundMovementSystem(float maxStableMoveSpeed, float sprintMoveSpeed, float stableMovementSharpness, float jumpSpeed) { _maxStableMoveSpeed = maxStableMoveSpeed; _sprintMoveSpeed = sprintMoveSpeed; _stableMovementSharpness = stableMovementSharpness; + _jumpSpeed = jumpSpeed; + } + + public void RequestJump(bool jumpPressed) + { + if (jumpPressed) + JumpRequested = true; + } + + public void CancelJumpRequest() + { + JumpRequested = false; } public void UpdateVelocity( @@ -41,6 +55,18 @@ namespace Code.Gameplay.Character.Controller targetMovementVelocity, 1f - Mathf.Exp(-_stableMovementSharpness * deltaTime) ); + + if (JumpRequested) + { + currentVelocity += motor.CharacterUp * _jumpSpeed - Vector3.Project(currentVelocity, motor.CharacterUp); + JumpRequested = false; + motor.ForceUnground(); + + if (motor.CharacterController is CustomCharacterController controller) + { + controller.TriggerJump(); + } + } } } } \ No newline at end of file diff --git a/Assets/Code/Gameplay/Character/Core/CharacterProvider.cs b/Assets/Code/Gameplay/Character/Core/CharacterProvider.cs index 83047f7..8b60eb5 100644 --- a/Assets/Code/Gameplay/Character/Core/CharacterProvider.cs +++ b/Assets/Code/Gameplay/Character/Core/CharacterProvider.cs @@ -33,6 +33,7 @@ namespace Code.Gameplay.Character.Core inputs.MoveAxisForward = moveInput.y; inputs.MoveAxisRight = moveInput.x; inputs.SprintPressed = _inputService.SprintHeld; + inputs.JumpPressed = _inputService.JumpPressed; inputs.CameraRotation = FindFirstObjectByType().GetCameraRotation(); inputs.CameraPlanarDirection = FindFirstObjectByType().GetPlanarDirection(); diff --git a/Assets/Code/Gameplay/Character/Core/CustomCharacterController.cs b/Assets/Code/Gameplay/Character/Core/CustomCharacterController.cs index 71e7666..f6c95bb 100644 --- a/Assets/Code/Gameplay/Character/Core/CustomCharacterController.cs +++ b/Assets/Code/Gameplay/Character/Core/CustomCharacterController.cs @@ -17,8 +17,14 @@ namespace Code.Gameplay.Character.Controller [SerializeField] private float maxStableMoveSpeed; [SerializeField] private float sprintMoveSpeed; [SerializeField] private float stableMovementSharpness; + [SerializeField] private float jumpSpeed; + [SerializeField] private float jumpCooldownDuration; [SerializeField] private Vector3 gravity; + private float _jumpCooldownTimer; + private float JumpCooldownDuration => jumpCooldownDuration; + public bool CanJump => _jumpCooldownTimer <= 0f; + public void SetPosition(Vector3 position) => motor.SetPosition(position); public void SetRotation(Quaternion rotation) => motor.SetRotation(rotation); @@ -31,7 +37,8 @@ namespace Code.Gameplay.Character.Controller _groundMovement = new GroundMovementSystem( maxStableMoveSpeed, sprintMoveSpeed, - stableMovementSharpness + stableMovementSharpness, + jumpSpeed ); _airMovement = new AirMovementSystem( gravity @@ -44,6 +51,17 @@ namespace Code.Gameplay.Character.Controller public void SetInputs(ref CharacterInputs inputs) { _inputHandler.ProcessInputs(ref inputs, motor); + + var jumpInput = inputs.JumpPressed; + + if (jumpInput && CanJump) + { + _groundMovement.RequestJump(true); + } + else + { + _groundMovement.RequestJump(false); + } } public void UpdateRotation(ref Quaternion currentRotation, float deltaTime) @@ -58,17 +76,27 @@ namespace Code.Gameplay.Character.Controller if (wasGrounded) { _groundMovement?.UpdateVelocity(ref currentVelocity, _inputHandler, motor, deltaTime); - } else { _airMovement?.UpdateVelocity(ref currentVelocity, deltaTime); } } + + public void TriggerJump() + { + _jumpCooldownTimer = JumpCooldownDuration; + } public void BeforeCharacterUpdate(float deltaTime) { } public void PostGroundingUpdate(float deltaTime) { } - public void AfterCharacterUpdate(float deltaTime) { } + + public void AfterCharacterUpdate(float deltaTime) + { + _jumpCooldownTimer -= deltaTime; + if (_jumpCooldownTimer < 0f) _jumpCooldownTimer = 0f; + } + public bool IsColliderValidForCollisions(Collider coll) => true; public void OnGroundHit(Collider hitCollider, Vector3 hitNormal, Vector3 hitPoint, ref HitStabilityReport hitStabilityReport) { } public void OnMovementHit(Collider hitCollider, Vector3 hitNormal, Vector3 hitPoint, ref HitStabilityReport hitStabilityReport) { } diff --git a/Assets/Resources/Scenes/Gameplay.unity b/Assets/Resources/Scenes/Gameplay.unity index 6e88895..b631183 100644 --- a/Assets/Resources/Scenes/Gameplay.unity +++ b/Assets/Resources/Scenes/Gameplay.unity @@ -539,6 +539,8 @@ MonoBehaviour: maxStableMoveSpeed: 6 sprintMoveSpeed: 9 stableMovementSharpness: 50 + jumpSpeed: 10 + jumpCooldownDuration: 0.5 gravity: {x: 0, y: -30, z: 0} --- !u!114 &1065569669 MonoBehaviour: