Issue with Unreachable Code Detected (but I need to yield return somewhere)
问题如下。我正在做一个打字游戏的变体,我的问题是我需要循环我的char数组并检查用户是否按了正确的键(引入了等待用户输入的要求)。当按下正确的键时,我需要while循环停止并返回for循环并重新开始。但当我返回时,它会同时退出两个循环,并检测到无法访问的代码。
我知道这意味着for循环不能通过它的其余迭代。那么,我在哪里屈服/回报呢?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| 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");
} |
When the right key is pressed, I need the while loop to stop and go back to the for loop and start over.
所以…EDOCX1?9?
But when I yield return, it exits both loops and I get Unreachable Code Detected.
不,yield return不退出任何循环。执行将恢复到原来的位置。
您看到"检测到无法访问的代码"的原因是因为while(true)永远不会退出,所以它知道i++永远不会到达。如果在while (true)中添加一个break;:它将正常工作。您也可以添加一个yield break;以退出整个枚举器,但这仍然意味着无法到达i++,并将标记为不可访问。
yield return不会停止循环运行,它只是(本质上)暂停循环,并返回当前值。一旦你重新开始,你仍然在循环中,因为它是一个while(true)循环,你将留在那里,所以从理论上说,i++语句确实是不可访问的。而且,如果数组中有任何元素,就永远无法访问print("Word Typing Ended");。
您可以使用传统的break语句退出while循环,或者如果您基本上想结束枚举器的执行,也可以使用yield break。
除此之外,应该使用yield来简化返回一个复杂的对象集合的过程,其中获取元素可能包含一些开销,或者元素依赖于以前的状态,但这本身应该是相对没有副作用的。我敢肯定,使用yield return null处理现有阵列是对该功能的滥用。
试着解释一下你到底想要做什么,可能有一个不需要屈服的解决方案。
- 小修正:可以到达print("Word Typing Ended");:在数组长度为零的情况下。是i++无法到达。
- 关于collections注释:yield return已被成功地用作在多个框架中实现协同例程的机制;我怀疑这就是OP在这里所做的(即实现代码以在其中一个框架内工作)。
- 是的,对不起,我没有包括在内。I++确实是无法达到的。所以问题仍然存在,我需要退出while循环才能到达迭代器。
- @MarcGravell,是的,方法的名称是一个提示。
- 有人告诉我,在继续执行循环之前,使用协同例程是一种让程序停止并等待用户输入的方法。否则,它会在for循环和my if语句中快速运行,除非反复按下键盘上的按钮。
- @是谁告诉你的,在什么情况下?大多数情况下,你不想让程序停止——一个热的while (true)循环是等待用户输入的一种非常糟糕的方式……
- 来自另一个论坛的人,哈哈。当我不想用我的低级问题打扰专业人士的时候,我就去那里。)但当有什么不对劲的时候,我来这里是为了更好的洞察力。所以,我假设我应该完全删除for循环,并找到其他方法在暂停用户输入时循环使用char数组。或者我应该在for循环中嵌套switch语句?还是不起作用?