【问题标题】:unity - play animations one at a timeunity - 一次播放一个动画
【发布时间】:2016-08-15 20:47:30
【问题描述】:

我有一个看起来像这样的协程函数:

// 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();
}

问题是循环同时进行,并且所有内容都同时进行动画处理。我想确保,例如pieces[2],只有当pieces[1] 达到动画时间的一半时,才会启动他的动画协程。

有可能吗?

谢谢

【问题讨论】:

  • 你可以使用Thread.Sleep()方法来延迟你的动画
  • @Rakitić No. OP 不应该使用Thread.Sleep() 来等待简单的动画。 Unity 将冻结。

标签: c# animation unity3d


【解决方案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());

【讨论】:

    【解决方案2】:

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

    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());
    }
    

    这将按顺序启动每个片段的动画,然后等待动画时间的一半,然后再循环到下一个片段。只需致电startAnimationSequence 即可开始循环。

    【讨论】:

      猜你喜欢
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-24
      • 2017-05-30
      • 1970-01-01
      • 2016-06-12
      • 1970-01-01
      相关资源
      最近更新 更多