1

问题如下。我正在制作打字游戏的变体,我的问题是我需要遍历我的 char 数组并检查用户是否按下了正确的键(引入等待用户输入的要求)。当按下右键时,我需要 while 循环停止并返回 for 循环并重新开始。但是当我返回时,它会退出两个循环,并且检测到无法访问的代码。

我知道这意味着 for 循环无法完成其余的迭代。那么我在哪里产生/返回?

IEnumerator TestMyCoroutine() {

    for (int i = 0; i < gCharArray.Length; i++) {
        string charHolder = gCharArray[i].ToString();

        while (true) {

            if (Input.anyKeyDown) {

                if (Input.GetKeyDown(charHolder)) {

                } else {

                    print("Wrong Letter");

                }
                print(charHolder);

            }

            yield return null;
        }
    }
    print("Word Typing Ended");
}
4

2 回答 2

2

yield return不会停止循环运行,它只是(本质上)暂停它,并返回当前值。一旦你恢复,你仍然在循环中,因为它是一个while(true)循环,你会呆在那里,所以这个语句i++在理论上确实是不可达的。print("Word Typing Ended");此外,如果数组有任何元素,您将永远无法找到。

while您可以使用传统语句退出循环break,或者如果您基本上想结束枚举器的执行,您也可以使用yield break.


除此之外,yield应该用于简化返回复杂的对象集合,其中获取元素可能包括一些开销,或者元素依赖于先前状态,但其本身应该是相对无副作用的。我很确定使用yield return null处理现有数组是对该功能的滥用。

试着解释你真正想要做什么,可能有一个不需要屈服的解决方案。

于 2015-12-16T09:19:46.767 回答
2

当按下右键时,我需要 while 循环停止并返回 for 循环并重新开始。

所以…… continue;

但是当我返回时,它会退出两个循环,并且检测到无法访问的代码。

不,yield return不退出任何循环。执行将恢复到原来的位置。

您看到“检测到无法访问的代码”的原因是因为while(true)that never exits,所以它知道i++永远不会到达。如果break;while (true): 中添加一个,它将正常工作。您还可以添加 ayield break;以退出整个枚举器,但这仍然意味着i++永远无法到达,并将标记为无法访问。

于 2015-12-16T09:19:54.833 回答