我正在使用 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);
}
听起来你只需要停止之前的协程。
当你调用 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;
}
}
在私有变量中缓存
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)
{
...
}