- Home /
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--;
}
}
Answer by Map-Builder · May 29, 2020 at 12:32 AM
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
Thank you so much! This worked for me. For anyone who is curious, i removed the loop from the FixedUpdate function and added it into my Ienumerator. The new code in the Ienumerator looks like this, the rest stayed the same:
private IEnumerator attackWait()
{
while (test > 0)
{
Debug.Log(test);
yield return new WaitForSecondsRealtime(2);
Attack();
yield return null;
}
}
Your answer
Follow this Question
Related Questions
Why is this coroutine only firing once? 3 Answers
What am I doing wrong with IEnumerator? 1 Answer
Coroutine design problem? 3 Answers
spawn timer problem 2 Answers