IEnumerator 的返回问题 new WaitForSeconds();

问题描述 投票:0回答:1

总结

我正在使用 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 个步骤。

我试过的

  • 使用 Invoke 和 WaitForSecondsRealtime 测试它是否仅在单个实例中,invoke 使情况变得更糟,而 realtime 没有变化。
  • 将硬延迟放入其中,仍然没有被捕获。
  • 包括一个 try/catch,它从未触发它的 catch 部分。
  • 使用 Mathf.Ceil 或 CeilToInt 将 waitTime 值从小数点后 8 位缩短
c# unity3d
1个回答
0
投票

您正在将“Mathf.CeilToInt”方法与“WaitForSeconds”一起使用,Mathf.CeilToInt 将浮点值向上舍入为最接近的整数,这会导致您提到的意外行为。

您可以直接将 waitTime 值传递给 WaitForSeconds(waitTime),而不是使用 Mathf.CeilToInt。

© www.soinside.com 2019 - 2024. All rights reserved.