Wall Jump with Jump Delay
Currently the Wall Jump can be spammed and the Cool Down does not work as intended. The player can press the space key when not grounded and is in contact with a wall via raycast, however they can mash the button and ascend up the wall, making the level pointless. The Cool Down and Timer implemented is only going back to zero (at which time they could wall jump again) when the player is in contact with the wall, instead of going back to zero based on when the jump key is pressed. Here below is the code being used. Any help: tips, tricks, or other implementations are welcome and greatly appreciated-
public float timer; public float coolDown; private void OnControllerColliderHit(ControllerColliderHit hit) { if (!controller.isGrounded && hit.normal.y < 0.1f) { if (timer > 0f) { timer -= Time.deltaTime; } else { if (Input.GetButtonDown("Jump")) { Debug.DrawRay(hit.point, hit.normal, Color.red, 1.25f); velocityY = jumpHeight 2f; Vector2 inputDir = hit.normal walkSpeed; Jump(); timer = coolDown; } } } } The rest of the code for more reference-
public float walkSpeed = 2; public float runSpeed = 6; public float gravity = -12; public float jumpHeight = 1; [Range(0, 1)] public float airControlPercent; public float turnSmoothTime = 0.2f; float turnSmoothVelocity; public float speedSmoothTime = 0.1f; float speedSmoothVelocity; float currentSpeed; float velocityY; public float timer; public float coolDown; Animator animator; Transform cameraT; CharacterController controller; // Start is called before the first frame update void Start() { animator = GetComponent(); cameraT = Camera.main.transform; controller = GetComponent(); } // Update is called once per frame void Update() { //input Vector2 input = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")); Vector2 inputDir = input.normalized; bool running = Input.GetKey(KeyCode.LeftShift); Move(inputDir, running); if (Input.GetKeyDown(KeyCode.Space)) { Jump(); } //animator float animationSpeedPercent = ((running) ? currentSpeed / runSpeed : currentSpeed / walkSpeed .5f); animator.SetFloat("speedPercent", animationSpeedPercent, speedSmoothTime, Time.deltaTime); } void Move(Vector2 inputDir, bool running) { if (inputDir != Vector2.zero) { float targetRotation = Mathf.Atan2(inputDir.x, inputDir.y) Mathf.Rad2Deg + cameraT.eulerAngles.y; transform.eulerAngles = Vector3.up Mathf.SmoothDampAngle(transform.eulerAngles.y, targetRotation, ref turnSmoothVelocity, GetModifiedSmoothTime(turnSmoothTime)); } float targetSpeed = ((running) ? runSpeed : walkSpeed) inputDir.magnitude; currentSpeed = Mathf.SmoothDamp(currentSpeed, targetSpeed, ref speedSmoothVelocity, GetModifiedSmoothTime(speedSmoothTime)); velocityY += Time.deltaTime gravity; Vector3 velocity = transform.forward currentSpeed + Vector3.up velocityY; controller.Move(velocity Time.deltaTime); currentSpeed = new Vector2(controller.velocity.x, controller.velocity.z).magnitude; if (controller.isGrounded) { velocityY = 0; } } void Jump() { if (controller.isGrounded) { float jumpVelocity = Mathf.Sqrt(-2 gravity jumpHeight); velocityY = jumpVelocity; } } float GetModifiedSmoothTime(float smoothTime) { if (controller.isGrounded) { return smoothTime; } if (airControlPercent == 0) { return float.MaxValue; } return smoothTime / airControlPercent; } private void OnControllerColliderHit(ControllerColliderHit hit) { if (!controller.isGrounded && hit.normal.y < 0.1f) { if (timer > 0f) { timer -= Time.deltaTime; } else { if (Input.GetButtonDown("Jump")) { Debug.DrawRay(hit.point, hit.normal, Color.red, 1.25f); velocityY = jumpHeight 2f; Vector2 inputDir = hit.normal walkSpeed; Jump(); timer = coolDown; } } } }