Double Tap Run

I want to make code the player walks faster if either key A or D is tapped twice. A (being left) and D (being right). Any suggestions on how I can do this.
Here’s my code:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Indingo : MonoBehaviour {
private Rigidbody2D MyRigidBody;
private Animator MyAnimator;
[SerializeField]
private float movementSpeed;
private bool facingRight;
// Use this for initialization
void Start ()
{
facingRight = true;
MyRigidBody = GetComponent();
MyAnimator = GetComponent();
}
// Update is called once per frame
void FixedUpdate ()
{
float horizontal = Input.GetAxis(“Horizontal”);
HandleMovement(horizontal);
Flip(horizontal);
}
private void HandleMovement(float horizontal)
{
MyRigidBody.velocity = new Vector2(horizontal * movementSpeed, MyRigidBody.velocity.y); // x – 1, y = 0;
MyAnimator.SetFloat(“speed”, Mathf.Abs(horizontal));
}
private void Flip(float horizontal)
{
if (horizontal > 0 && !facingRight || horizontal < 0 && facingRight)
{
facingRight = !facingRight;
Vector3 thescale = transform.localScale;
thescale.x *= -1;
transform.localScale = thescale;
}
}
}

Hi there @DiamondMC102 . You could simply start a coroutine that waits a certain amount of time (you could have a public float that would represent the max interval between double clicks.

Example:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Movement : MonoBehaviour {

    public float intervalOfDoubleTap;

    public float fastMoveSpeed = 4f;

    public float slowMoveSpeed = 2f;

    bool waitingForDoubleTap_Left = false;

    bool waitingForDoubleTap_Right = false;

    bool normal_isMovingLeft = false;

    bool fast_isMovingLeft = false;

    bool normal_isMovingRight = false;

    bool fast_isMovingRight = false;

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            if (waitingForDoubleTap_Left)
            {
                normal_isMovingLeft = false;
                fast_isMovingLeft = true;
            }
            waitingForDoubleTap_Left = true;
            normal_isMovingLeft = true;
            StartCoroutine(WaitForDoubleTap_Left());
        }

        if (Input.GetKeyDown(KeyCode.D))
        {
            if (waitingForDoubleTap_Right)
            {
                normal_isMovingRight = false;
                fast_isMovingRight = true;
            }
            waitingForDoubleTap_Right = true;
            normal_isMovingRight = true;
            StartCoroutine(WaitForDoubleTap_Right());
        }

        if (Input.GetKeyUp(KeyCode.A))
        {
            normal_isMovingLeft = false;
            fast_isMovingLeft = false;
        }

        if (Input.GetKeyUp(KeyCode.D))
        {
            normal_isMovingRight = false;
            fast_isMovingRight = false;
        }

    }

    private void FixedUpdate()
    {
        if (normal_isMovingLeft)
        {
            gameObject.transform.Translate(-1 * transform.right * Time.fixedDeltaTime * slowMoveSpeed);
        }

        if (fast_isMovingLeft)
        {
            gameObject.transform.Translate(-1 * transform.right * Time.fixedDeltaTime * fastMoveSpeed);
        }

        if (normal_isMovingRight)
        {
            gameObject.transform.Translate(transform.right * Time.fixedDeltaTime * slowMoveSpeed);
        }

        if (fast_isMovingRight)
        {
            gameObject.transform.Translate(transform.right * Time.fixedDeltaTime * fastMoveSpeed);
        }

    }

    private IEnumerator WaitForDoubleTap_Left()
    {
        yield return new WaitForSecondsRealtime(intervalOfDoubleTap);
        waitingForDoubleTap_Left = false;
    }
    private IEnumerator WaitForDoubleTap_Right()
    {
        yield return new WaitForSecondsRealtime(intervalOfDoubleTap);
        waitingForDoubleTap_Right = false;
    }

}

Repeat the process for forward movement if required.

Go Ahead and drop it on your gameobject, but make sure you fill the values in the inspector.

If this helped you please mark it as the best answer :smiley:

Happy coding!

First off this: Using code tags properly

        IEnumerator checkIfDoubleTap(float timeInMS, KeyCode keyCode)
{
    float timer = 0;
    timer += Time.deltaTime;
    while (timer < timeInMS)
    {
        print(timer);
        if (Input.GetKeyDown(keyCode))
        {
            hasSBeenPressed = true;
        }
        else
        {
            hasSBeenPressed = false;
        }

        yield return null;
    }
    yield return null;
}

This is what I came up for you, you could make this better by having the Ienumerator return a value so you don’t manually set whether the k had been pressed. I called this with this:

        if (Input.GetKeyDown(KeyCode.S))
        {
            StartCoroutine(checkIfDoubleTap(200, KeyCode.S));
        }