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
相关产品推荐
相关产品推荐

