У меня есть цикл for в C #, я хочу запустить только один раз - PullRequest
1 голос
/ 06 мая 2019

У меня есть цикл for, который мне нужно вызывать только один раз, когда я перебираю массив.

    public void ChangeClassButton()
    {
        Debug.Log("Changed Class");
        for (int i = 0; i < activeDrum.Length && !changeClassBool; i++)
        {
            Debug.Log(activeDrum[i]);
            changeClassText.text = activeDrum[i];
            OscMessage oscM = Osc.StringToOscMessage("/changeClass" + i);
            Debug.Log(Osc.OscMessageToString(oscM));
            oscHandler.Send(oscM);
            changeClassBool = true;
            if (i >= activeDrum.Length)
            {
                i = 0;
            }
        }
    }

У меня есть отдельная функция, устанавливающая changeClassBool обратно в false после определенного промежутка времени.

Я пытаюсь выполнить итерацию при нажатии кнопки, но когда я нажимаюкнопка в игре просто перебирает весь массив.Любые предложения, как что я делаю не так?

Ответы [ 3 ]

5 голосов
/ 06 мая 2019

Цикл for может быть не лучшим способом для этого. Как насчет просто увеличить значение при вызове метода?

private int count = 0;

public void ChangeClassButton()
{
    Debug.Log("Skiftede klasse");
    if(!changeClassBool){
    {
        Debug.Log(activeDrum[count]);
        changeClassText.text = activeDrum[count];
        OscMessage oscM = Osc.StringToOscMessage("/changeClass" + count);
        Debug.Log(Osc.OscMessageToString(oscM));
        oscHandler.Send(oscM);
        changeClassBool = true;
        if (count >= activeDrum.Length)
        {
            count = 0;
        } else{
            count++;
        }
    }
}

Кроме того, почему это не работает сейчас. Вы упоминаете, что вы установили changeClassBool в false через определенное время. Но этот цикл запускается мгновенно, что означает, что он завершится за один кадр, независимо от того, насколько велик цикл. Если вы хотите подождать в цикле, вы можете сделать его сопрограммой и добавить yield return null, чтобы заставить его ждать один кадр.

Но если единственное, что вы хотите сделать, это проходить это каждый раз, когда вы нажимаете кнопку, просто использование счетчика вместо цикла намного менее сложно и стабильно.

0 голосов
/ 07 мая 2019

если все, что вам нужно, это перебирать этот массив (activeDrum) только один раз, почему бы не использовать «для каждого»? это также может сэкономить вам дополнительные логические значения в цикле for.

0 голосов
/ 06 мая 2019

используйте цикл while.

int i = 0;
        public void ChangeClassButton()
        {
            while (!changeClassBool)
            {
                Debug.Log(activeDrum[i]);
                changeClassText.text = activeDrum[i];
                OscMessage oscM = Osc.StringToOscMessage("/changeClass" + i);
                Debug.Log(Osc.OscMessageToString(oscM));
                oscHandler.Send(oscM);
                changeClassBool = true;
                if (i >= activeDrum.Length)
                {
                    i = 0;
                }
                else
                {
                    ++i;
                }
            }
        }

Этот цикл выполняется один раз.

...