C# - 如果再次调用触发它的函数,如何从循环中中断?

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

我正在使用 C# 和 Unity 开发视频游戏,我的 TypeDialog IEnumerator 函数用于将字符串键入 UI 文本框。这是有效的,但是当它被调用两次时,它会尝试同时打印出两个字符串。

例如,如果我调用该函数并传入字符串“string 1”,几秒钟后再次调用它并传入“string 2”,UI 文本框将显示消息为“ssttrriinngg 12”。我如何更改此代码以便在第二次调用时停止打印第一条消息?

    public IEnumerator TypeDialog(string dialog)
{
    dialogText.text = "";
    foreach (var letter in dialog.ToCharArray())
    {
        dialogText.text += letter;
        yield return new WaitForSeconds(1f / letterPerSecond);
    }

    yield return new WaitForSeconds(1f);
}
c# string loops unity3d foreach
2个回答
1
投票

听起来你只需要停止之前的协程。

当你调用 StartCoroutine() 时,你可以将它创建的协程保存到你的类中的一个变量中,然后在需要时停止它。

public class MyBehaviour : MonoBehaviour
{
    [SerializeField] TextMeshProUGUI dialogText = default;
    [SerializeField] int lettersPerSecond = 15;
    Coroutine typeDialogRoutine = null;

    public void TypeDialog(string dialog)
    {
        if(typeDialogRoutine != null)
           StopCoroutine(typeDialogRoutine);
        typeDialogRoutine = StartCoroutine(DoTypeDialogRoutine(dialog));
    }

    IEnumerator DoTypeDialogRoutine(string dialog)
    {
        dialogText.text = "";
        foreach (var letter in dialog.ToCharArray())
        {
            dialogText.text += letter;
            yield return new WaitForSeconds(1f / letterPerSecond);
        }

        yield return new WaitForSeconds(1f);
        typeDialogRoutine = null;
    }
}

1
投票

在私有变量中缓存

Coroutine
,然后在下一个对话之前停止它。

private Coroutine dialogCoroutine;
void NewDialouge(string _text)
{
    if (dialogCoroutine != null) StopCoroutine(dialogCoroutine); // this will stops currently dialog..
    dialogCoroutine = StartCoroutine(TypeDialog(_text));
}

IEnumerator TypeDialog(string dialog)
{
    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.