Problems with do-while loops and IEnumerator

Ok, first of all, hello to anyone that may come across this question, hope that you have luck in your search quest

Now, here is my problem. I have an attack function that i want to be called when the user presses the shift key, i want this function to run as long as an “attack charge” value is bigger then 0. So i created a loop, and that crashed Unity. I then heard about Ienumerators and that you should use them to slow down the loop so that it does not crash and run everything on the same frame.

So i tried that, and it did not work. For convinience sake, i created a private int called “test” and used that as a test variable. And it still crashed Unity, i tried with GetKey and GetKeyDown, but with no luck. Therefore, i am posting my first question here!

Please do not hesitate to ask if you need more context to my question

(Sorry for bad english or, somewhat, messy code. Or if this has been posted before)

Here is the entire code that (i think) gives me trouble, i removed all the unnessessary code, but if you need the entire code, then please let me know:

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

public class PlayerAttack : MonoBehaviour
{
    private int test;

    // Start is called before the first frame update
    void Start()
    {
        test = 5;
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        if (Input.GetKeyDown(KeyCode.LeftShift))
        {
            do
            {
                Debug.Log(test);
                StartCoroutine(attackWait());
            } while (test > 0);
        }
    }

    private IEnumerator attackWait()
    {
        yield return new WaitForSecondsRealtime(3);
        Attack();
    }

    void Attack()
    {
        test--;
    }
}

you loop infinitely and calling an infinite amount of coroutine which are gonna be call in 3s but you’re looping in the same frame so those 3s will never come.


A coroutine does stop the code only inside the coroutine, not in the fixedupdate

remove the do loop

and put a do while in your coroutine with a “yield return null”. little bit harsh at the beginning, but you’ll get it