Почему мой цикл foreach выполняется в таком порядке? - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть игра Unity3D, в этой игре есть игра, похожая на iMimic.

Проблема здесь в том, что весь код работает отлично, но в нем есть детали,
игра запускается в следующем порядке: How it runs, (как видите, все вместе), но мне нужно, чтобы она работала так: enter image description here

Может быть, это деталь цикла foeach? Или IEnumerators?

 void Randomizer()
    {
        PreList = PreList.OrderBy(C => Rnd.Next()).ToArray();
        foreach (var item in PreList)
        {
            Debug.Log(item.ToString());
            if (item == 1)
            {
                StartCoroutine(OneMethod());
            }
            if (item == 2)
            {
                StartCoroutine(TwoMethod());

            }
        if (item == 3)
        {
            StartCoroutine(ThreeMethod());

        }
}
 IEnumerator OneMethod()
 {
    ButtonList.Add(1);
    GameObject.Find("Red").GetComponent<Image>().color = Color.gray;
    //Sound
    yield return new WaitForSeconds(1);
    GameObject.Find("Red").GetComponent<Image>().color = Color.white;
    Debug.Log("Everyone");
    yield return new WaitForSeconds(1);
}
IEnumerator TwoMethod()
{
    ButtonList.Add(2);
    GameObject.Find("Blue").GetComponent<Image>().color = Color.gray;
    yield return new WaitForSeconds(1);
    GameObject.Find("Blue").GetComponent<Image>().color = Color.white;
    Debug.Log("Everyone");
    yield return new WaitForSeconds(1);
}
IEnumerator ThreeMethod()
{
    ButtonList.Add(3);
    GameObject.Find("Green").GetComponent<Image>().color = Color.gray;
    yield return new WaitForSeconds(1);
    GameObject.Find("Green").GetComponent<Image>().color = Color.white;
    Debug.Log("Everyone");
    yield return new WaitForSeconds(1);
}

1 Ответ

0 голосов
/ 18 сентября 2018

Если вы хотите, чтобы каждый код в цикле for выполнялся один за другим, вы должны заставить его ждать завершения функций сопрограммы, вызываемых в цикле for, до следующего цикла.Сделайте функцию Randomizer() сопрограммой, а затем вызовите вызовы функций OneMethod(), TwoMethod() и ThreeMethod() с помощью yield return StartCoroutine(YourMEthod()).

IEnumerator Randomizer()
{
    PreList = PreList.OrderBy(C => Rnd.Next()).ToArray();
    foreach (var item in PreList)
    {
        Debug.Log(item.ToString());
        if (item == 1)
        {
            yield return StartCoroutine(OneMethod());
        }
        if (item == 2)
        {
            yield return StartCoroutine(TwoMethod());

        }
        if (item == 3)
        {
            yield return StartCoroutine(ThreeMethod());
        }
    }
}

Наконец, вы должны изменить способ вызова Randomizer().Он должен измениться с Randomizer(); на StartCoroutine(Randomizer());, потому что теперь это функция сопрограммы.

...