How can I Wall Jump with a 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-
private void OnControllerColliderHit(ControllerColliderHit hit)
{
if (Input.GetButtonDown("Jump"))
if (!controller.isGrounded && hit.normal.y < 0.1f)
{
{
{
Debug.DrawRay(hit.point, hit.normal, Color.red, 1.25f);
velocityY = jumpHeight * 3f;
Vector2 inputDir = hit.normal * walkSpeed;
}
}
}
}
}
Heres the rest of the code for further 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;
Animator animator;
Transform cameraT;
CharacterController controller;
// Start is called before the first frame update
void Start()
{
animator = GetComponent<Animator>();
cameraT = Camera.main.transform;
controller = GetComponent<CharacterController>();
}
// 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 (Input.GetButtonDown("Jump"))
if (!controller.isGrounded && hit.normal.y < 0.1f)
{
{
{
Debug.DrawRay(hit.point, hit.normal, Color.red, 1.25f);
velocityY = jumpHeight * 3f;
Vector2 inputDir = hit.normal * walkSpeed;
}
Answer by SilverFishNsfw · Apr 16, 2020 at 02:34 AM
Figured it out, here's my addendum to the script.
private float canJump = 0f;
private float canRun = 0f;
private void OnControllerColliderHit(ControllerColliderHit hit)
{
{
if (!controller.isGrounded && hit.normal.y < 0.1f)
{
if (Input.GetButtonDown("Jump") && Time.time > canJump)
{
{
Debug.DrawRay(hit.point, hit.normal, Color.red, 1.25f);
velocityY = jumpHeight * 4f;
Vector2 inputDir = hit.normal * walkSpeed;
canJump = Time.time + .92f;
}
}
if (Input.GetKey(KeyCode.LeftShift) && Time.time > canRun)
{
Debug.DrawRay(hit.point, hit.normal, Color.red, 1.25f);
velocityY = walkSpeed * 3f;
Vector2 inputDir = hit.normal * runSpeed;
canRun = Time.time + 3f;
}
}
}
}