总结: 我正在使用 WaitForSeconds 创建延迟事件,以便它会更改当前处于活动状态的对话步骤以允许故事进展,它在某些情况下有效而在其他情况下无效。我不知道是什么原因造成的。
代码:
float waitTime = currentStep.isSpoken ? currentStep.dialogueClip.length + 1.0f : 2.0f;
selectedText = null;
if(currentStep.speaker.ToString() != "Gui"){
StartCoroutine( ProgessStep(waitTime) );
}
}
IEnumerator ProgessStep(float waitTime) {
if(currentStep.stepName.Equals("S1-P1-1")) {
yield break;
}
else if(currentStep.stepName.Equals("S2-P1-5-8")) {
if(levelManager.fireAlarmTested) {
SetStep("S2-P1-5-10");
yield break;
}
else {
levelManager.fireAlarmTested = true;
}
}
if(currentStep.nextStep.Equals(""))
yield break;
Debug.Log($"Waiting for {waitTime}s before moving to {currentStep.nextStep}");
yield return new WaitForSeconds(waitTime);
Debug.Log($"Moving to {currentStep.nextStep}");
if(!currentStep.canRespond)
SetStep(currentStep.nextStep);
}
预期结果: 它应该经过几次检查,然后等到音频剪辑(如果存在)完成后再继续下一步。
实际结果: 第一次会按照预期的结果完成。但是,如果在下一步中再次调用它,则它会忽略 WaitForSeconds 并直接进入另一个步骤。在 WaitForSeconds 似乎再次被触发并结束之前,这将持续 4 个步骤。
我试过的:
您正在将“Mathf.CeilToInt”方法与“WaitForSeconds”一起使用,Mathf.CeilToInt 将浮点值向上舍入为最接近的整数,这会导致您提到的意外行为。
您可以直接将 waitTime 值传递给 WaitForSeconds(waitTime),而不是使用 Mathf.CeilToInt。