【问题标题】:I have a for-loop in C# I want to run only once我在 C# 中有一个 for 循环我只想运行一次
【发布时间】:2019-09-23 21:44:42
【问题描述】:

我有一个 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。

我试图在按下按钮时进行迭代,但是当我在游戏中按下按钮时,它只会迭代整个数组。关于我做错了什么有什么建议吗?

【问题讨论】:

  • 不完全确定你在这里问什么。如果你不想要一个循环,你不能简单地删除循环吗?或者您是在问如何让按钮一次完成一项迭代?
  • 您想一直迭代到 i = 0 还是每次点击都会使 i 增加 1?
  • 如果您不点击按钮,那么activeDrum.Length 是什么? changeClassBool 的价值是什么?

标签: c# for-loop unity3d boolean


【解决方案1】:

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 以使其等待一帧。

但是,如果您只想在每次单击按钮时执行此操作,那么仅使用计数器而不是循环会更简单且更稳定。

【讨论】:

  • 很高兴这是您要找的东西,我还添加了一些关于 for 循环出了什么问题的解释,以防您将来需要它用于不同的用例。
【解决方案2】:

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

这个循环运行一次。

【讨论】:

    【解决方案3】:

    如果你只需要遍历这个数组(activeDrum)一次,为什么不使用“for each”呢?它还可以为您节省此 for 循环中的额外布尔值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-15
      • 2014-12-07
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多