我在C#中有一个for循环,我只想运行一次

时间:2019-05-06 09:12:10

标签: c# for-loop unity3d boolean

我有一个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 个答案:

答案 0 :(得分:5)

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。但是此循环是立即运行的,这意味着无论循环有多大,它都将在一帧内完成。如果要在循环中等待,可以将其设为coroutine,然后添加yield return null以使其等待一帧。

但是,如果您唯一想做的就是每次单击按钮时都要进行一次遍历,那么使用计数器而不是循环就不那么复杂和稳定了。

答案 1 :(得分:0)

使用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;
                }
            }
        }

此循环运行一次。

答案 2 :(得分:0)

如果您只需要遍历此数组(activeDrum)一次,为什么不使用“ for each”呢?可能还会为您节省此for循环中的多余布尔值。