当我完成关卡时,它必须显示“等级已完成!”#34;文本并等待5秒然后开始下一级。
private void showSuccess() {
levelCompleted.SetActive (true);
StartCoroutine("waitForNextLevel");
}
IEnumerator waitForNextLevel() {
Debug.Log ("Start time: " + Time.time);
yield return new WaitForSeconds (5);
Debug.Log ("End time: " + Time.time);
prepareTheLevel ();
}
然而,文本显示成功,游戏等待5秒,文本消失。然后等待另外5秒并开始下一个级别。
我希望它只等待5秒而不隐藏文字。
有什么想法吗?
答案 0 :(得分:4)
听起来你有以下几点:
const std::vector<Directions>& horizontalDirections() {
static const std::vector<Directions> toReturn = {
Left,
Right
};
return toReturn;
}
在某处的游戏对象上。
如果是这种情况,则每帧都会调用if (playerScore > winScore)
showSuccess();
,并且每次创建一个新的协程,在5秒内启动下一个级别。当第一个完成时,级别被破坏(删除文本)并且下一个级别开始加载 - 但是你有5秒钟的协同程序堆叠,所以大约每个帧都会再次调用showSuccess
,直到你用完为止活跃的协程。
你用bool来保护它的解决方案非常接近你应该做的事情,但是错过了堆积5秒钟协同程序的根本问题 - 我建议保护对prepareTheLevel
的呼叫 - 你甚至可以在levelCompleted文本上使用活动标志,即:
StartCoroutine
这样,第二次调用private void showSuccess() {
if (levelCompleted.IsActive() == false) {
levelCompleted.SetActive (true);
StartCoroutine("waitForNextLevel");
}
}
就会看到showSuccess
处于活动状态,并且不执行任何操作,只留下一个levelCompleted
coroutine。
答案 1 :(得分:0)
好的,我一如既往地解决了我的问题。然而,这对我来说并不令人满意。我看到Unity一遍又一遍地执行WaitForLevel方法下面的代码5秒钟。为什么这样做呢? :S
以下代码解决了我的问题
private bool isWaited = false;
IEnumerator waitForNextLevel() {
Debug.Log ("Start time: " + Time.time);
yield return new WaitForSeconds (5);
Debug.Log ("End time: " + Time.time);
if (!isWaited) {
prepareTheLevel ();
isWaited = true;
}
}