You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中基于C#的协程打字机效果随机卡顿问题求解

打字机效果协程重复字符问题的解决方案

问题根源

你遇到的文本重复(比如"Hello"变成"Heeeelllllooooooo"),核心原因是同一时间有多个TypeSentence协程在并行执行。比如切换随机对话时,前一次的协程未被终止就启动了新的,两个协程同时向TextMeshPro文本组件追加字符,导致字符重复叠加。此外,过短的等待时长(0.004f)可能加剧帧调度冲突,但主要问题还是多协程并发修改。

修复方案

1. 管控协程生命周期,避免多协程并发

首先在脚本类中声明一个协程引用变量,用于跟踪当前运行的打字协程:

private Coroutine typingCoroutine;

然后在启动协程的地方,先停止之前的协程再启动新的:

// 启动新打字协程前,终止正在运行的旧协程
if (typingCoroutine != null)
{
    StopCoroutine(typingCoroutine);
}
// 启动新协程并保存引用
typingCoroutine = StartCoroutine(TypeSentence(你的随机对话字符串));

2. 优化协程内部逻辑

修改TypeSentence协程,使用StringBuilder缓存字符(减少频繁修改TMP文本的性能开销),并在协程结束后清空引用:

IEnumerator TypeSentence(string sentence)
{
    dialoguefinished = false;
    dialogueTMPtext.text = string.Empty; // 先清空原有文本
    StringBuilder typedText = new StringBuilder();
    // 适当延长等待时长,避免过于密集的文本更新
    var waitTimer = new WaitForSeconds(0.01f);

    foreach (char letter in sentence)
    {
        if (!readingcode)
        {
            typedText.Append(letter);
            dialogueTMPtext.text = typedText.ToString();
            yield return waitTimer;
        }
        // 可选:如果readingcode为true,暂停打字并等待状态恢复
        // else
        // {
        //     yield return null;
        //     continue;
        // }
    }

    dialoguefinished = true;
    typingCoroutine = null; // 协程结束后清空引用
}

额外注意事项

  • 确保readingcode的状态修改仅在主线程执行(Unity中默认都是主线程,无需额外处理),如果是用于暂停打字的逻辑,要保证状态切换时协程能正确响应。
  • 避免使用过短的等待间隔(如0.004f),这个时长接近60帧游戏的单帧耗时(约0.0167f),过于密集的文本修改可能导致TMP组件渲染滞后。

内容的提问来源于stack exchange,提问作者tumhaarajeeja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 01:27:06