问题如下。我正在制作一个打字游戏的变种,我的问题是我需要遍历我的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");
}
答案 0 :(得分:2)
yield return
不会阻止循环运行,它只是(本质上)暂停它,并返回当前值。一旦你恢复,你仍然处于循环中,并且由于它是一个while(true)
循环,你会留在那里,所以声明i++
在理论上确实无法到达。此外,如果数组中包含任何元素,您将永远不会访问print("Word Typing Ended");
。
您可以使用传统的while
语句退出break
循环,或者如果您基本上想要结束枚举器的执行,您也可以使用yield break
。
除此之外,yield
应该用于简化返回复杂的对象集合,其中获取元素可能包含一些开销,或者元素依赖于先前的状态,但是它本身应该是相对无副作用。我非常确定使用yield return null
处理现有数组是对该功能的误用。
尝试解释你真正想要做的事情,可能有一个不需要屈服的解决方案。
答案 1 :(得分:2)
当按下右键时,我需要while循环停止并返回到for循环并重新开始。
所以... continue;
?
但是当我返回时,它会退出两个循环并且我检测到无法访问的代码。
不,yield return
不会退出任何循环。执行将恢复到原来的位置。
您看到&#34;检测到无法访问的代码的原因&#34;是因为{{1>} 永不退出,所以它知道永远不会达到while(true)
。如果您在i++
内添加break;
:它将正常运行。您还可以添加while (true)
以退出整个枚举器,但仍然意味着永远不会达到yield break;
,并且会标记为无法访问。