unity3d 如果触发循环的函数被再次调用,如何中断循环?

63lcw9qa  于 2023-03-13  发布在  其他
关注(0)|答案(2)|浏览(275)

我正在用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);
}
qlvxas9a

qlvxas9a1#

听起来你只需要停止之前的协程。
当你调用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;
    }
}
6yt4nkrj

6yt4nkrj2#

在私有变量中缓存Coroutine,然后在下一个对话框之前停止。

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

IEnumerator TypeDialog(string dialog)
{
    ...
}

相关问题