How to start looped code (like that in Update()) from the area that runs once?

Okay.

I need to freeze character movement for some time when GetButtonDown (to play Jump Prepare animation; I need the character to stay).

Character is running → Hit Jump → Character is Preparing → Character is Jumping. So I need to stop moving when it is preparing to jump (it is a little time step as 0.3335 seconds).

This code below runs in Update() in the script that on the character. ‘v’ is input from the Vertical axis. JumpForward() just defines a Vector to jump and AddForce to character’s Rigidbody.

if (Input.GetButtonDown("Jump") && v > 0.5f) // jump forward
            {
                isJumpPressed = true; // trigger prepare animation
                // stop motion

                // we need to run AddForce with delay for prepare animation!
                Invoke("JumpForward", 0.667f / 2f);

I can assign 0 to ‘v’ variable (that is responsive to movement) in each frame while the character is preparing (while this animation is playing)… But how can I do it? This code runs only once when the button is down.

How to start looped code (like that in Update()) from the area that runs once?

Thank you for any help.

Here is as I solve this.

void Update()
{
    // Should stop?
    if (shouldStop)
    {
        v = 0f;
    }

    // JUMPING

    {
        if (Input.GetButtonDown("Jump") && v > 0.5f) // jump forward
        {
            isJumpPressed = true; // trigger prepare animation
            // stop motion
            shouldStop = true;
            StartCoroutine(ShouldStopOff());
            // we need to run AddForce with delay for prepare animation!
            Invoke("JumpForward", 0.667f / 2f);
        }
    }
}
IEnumerator ShouldStopOff()
{
    yield return new WaitForSeconds(0.3335f);
    shouldStop = false;

}

The answer is Coroutines.