团结 - 一次播放一个动画

时间:2016-08-15 20:47:31

标签: c# animation unity3d

我有一个coroutine函数看起来像这样:

// Replacing on start game
public virtual void Replace()
{
    StartCoroutine(ReplaceCoroutine());
}

// the Replacing animation
private IEnumerator ReplaceCoroutine()
{
    // check if the piece has an animation attached
    Animator animator = GetComponent<Animator>();
    if (animator)
    {
        animator.Play(clearAnimation.name);
        yield return new WaitForSeconds(clearAnimation.length);
    }
}

我用这样的循环激活它:

// mixing pieces
for (int i = 0; i < 5; i++)
{
    pieces[i].Replace();
}

问题在于循环一次完成,并且所有内容同时都是动画。我想确保,例如,片段[2]只有当片段[1]在动画中占据了一半的时间时才会启动他的动画协程。

有可能吗?

谢谢

2 个答案:

答案 0 :(得分:1)

你必须打电话给你

for (int i = 0; i < 5; i++)
{
    pieces[i].Replace();
}
从另一个协同函数

然后等待每个协同函数返回。 您可以通过yielding StartCoroutine函数调用来执行此操作。下面的代码将调用yourCoroutineFunction函数,然后在运行下一个循环之前等待它完成。

for (int i = 0; i < 5; i++)
{
    yield return StartCoroutine(yourCoroutineFunction());
}

我无法分辨你的功能放在哪里,但下面应该对你有用。如果没有,请使用上面的示例来解决您的问题。

public IEnumerator ReplaceCoroutine()
{
    // check if the piece has an animation attached
    Animator animator = GetComponent<Animator>();
    if (animator)
    {
        animator.Play(clearAnimation.name);
        yield return new WaitForSeconds(clearAnimation.length);
    }
}

IEnumerator playAll()
{
    for (int i = 0; i < 5; i++)
    {
        yield return pieces[i].StartCoroutine(ReplaceCoroutine());
    }
}

然后调用它,使用StartCoroutine(playAll());

答案 1 :(得分:0)

如果你想控制每个部分相对于前一部分(如上所述的动画时间的一半),你希望你的协程在每个部分操作之后产生但是在一个协同程序中完成所有操作,不是每一件单独的协程。

asum

这将按顺序启动每个动画的动画,然后等待动画时间的一半,然后循环到下一个动画。只需致电public IEnumerator ReplaceCoroutine() { for(int i=0; i<pieces.Length; i++) { // check if the piece has an animation attached Animator animator = pieces[i].GetComponent<Animator>(); if (animator!=null) { animator.Play(pieces[i].clearAnimation.name); yield return new WaitForSeconds(pieces[i].clearAnimation.length/2.0f); } } } void startAnimationSequence { StartCoroutine(ReplaceCoroutine()); } 即可开始循环。