C# Unity-从foreach循环调用动画

C# Unity-从foreach循环调用动画,c#,animation,unity3d,foreach,C#,Animation,Unity3d,Foreach,我正在制作一个游戏,当一个特定的函数被调用时,在场景中添加一个随机数或随机事件。我正在尝试制作一个文本框的动画,它一个接一个地告诉你每个效果是什么。我让每个效果向列表中添加一个文本字符串,并使用foreach循环更改文本框中的文本,然后设置动画触发器以使文本框在屏幕上移动。我无法让循环等待动画完成,从而只生成最后的动画效果文本 public class UIAnimation : MonoBehaviour { public Animator animator; public

我正在制作一个游戏,当一个特定的函数被调用时,在场景中添加一个随机数或随机事件。我正在尝试制作一个文本框的动画,它一个接一个地告诉你每个效果是什么。我让每个效果向列表中添加一个文本字符串,并使用foreach循环更改文本框中的文本,然后设置动画触发器以使文本框在屏幕上移动。我无法让循环等待动画完成,从而只生成最后的动画效果文本

public class UIAnimation : MonoBehaviour {

    public Animator animator;
    public Text NBtext;
    public GameObject NBEffect;

    public void NiceBowlingEffects(List<string> Effects)
    {
        foreach (var Effect in Effects)
        {
            NBtext.text = Effect;
            print(Effect);
            StartCoroutine(Animate());
        }
    }

    private IEnumerator Animate()
    {
        animator.SetTrigger("SlideText");
        yield return new WaitForSeconds(.75f); //animation is .7 seconds
    }
}

这是因为协同程序的行为就像一个单独的线程。因此,您基本上是以正常的速度在forloop中循环,在几乎相同的时间启动所有的协程,因此在几乎相同的时间设置所有动画触发器。您需要做的是将延迟放在循环本身中

public void NiceBowlingEffects(List<string> Effects)
{
    StartCoroutine(Animate(Effects));
}

private IEnumerator Animate(Effects)
{
    foreach (var Effect in Effects)
    {
        NBtext.text = Effect;
        print(Effect);
        animator.SetTrigger("SlideText");
        yield return new WaitForSeconds(.75f); //animation is .7 seconds
    }
}

或者你也可以把保龄球的特效变成协同程序,简化一点。

非常感谢你,我真是束手无策,这是一个非常简单的解决方案。你救了我一天。