- Home /
The question is answered, right answer was accepted
How do I start several coroutines and wait until they ALL return? (C#)
I'm making a turn-based game with an arbitrary number of players. Turns happen simultaneously, players plan their move and then when all players submit, the plans are resolved. Think rock-paper-scissors, you decide what you're going to throw then throw at the same time.
So, what I need for the first phase is for it to spawn a coroutine for each player to plan their move, and then submit it to a data structure the original method can see. I need the original method to wait until all the coroutines return.
What I really need help with is how to do that waiting, and how the coroutines will give their returns to the original method?
Answer by iwaldrop · May 06, 2013 at 03:29 AM
I'm not convinced that you need more than one coroutine, but either way what you need is a counter. You should know how many players you have, so if the number of responses that you've received is equal to the number of players that you have, then continue.
It would make sense to have one coroutine running on the master that waits for all player submissions. Once all submissions have been received then process the submissions, and send the results to the clients.
I cant find a counter in the scripting docs, what does what you're describing look like in code?
This isn't something you can just copy from someone else's code. You will need to figure out how to make a counter yourself. If you don't know, please consult a basic program$$anonymous$$g book or website.
There isn't one particular way that you have to count things, but this is what I was thinking about when I read your question. Because you know how many players you have connected, you know how many replies you need. Once the number of replies that you've received is not less than the number of players that you have you should do something with them.
int numPlayers;
List<Reply> replies;
IEnumerator WaitForReplies()
{
while (replies.Count < numPlayers)
yield return null;
// do something once all players have replied.
}