等待协程完成后再继续前进

时间:2019-06-18 17:13:18

标签: c# unity3d

所以我有这个协程将一个对象移动到一个地方,我用它来处理一系列对象,但是我希望它将它们一个一个地移动(也就是等到以前的协程完成后再开始一个新的协程)。但是增加任何收益只会使整个事情停顿下来……我有点迷失了为什么。

我曾经尝试添加“ yield return new WaitUnitl()”或“ WaitForSeconds”,但是无论我在何处放置,它要么让它等待一次移动所有内容,要么它们就停止了一次移动

移动代码:

public IEnumerator MoveObject(Vector3 source, Vector3 target, float overTime)
    {
        float startTime = Time.time;
        while (Time.time < startTime + overTime)
        {
           transform.position = Vector3.Lerp(source, target, (Time.time -     startTime) / overTime);

            yield return null;

        }


        transform.position = target;


    }

在此for循环中调用:

for (int i = 0; i < CardsInHand.Count; i++)
        {
            Card c = CardsInHand[i];
            Vector3 target = new Vector3(startt + (1.5f * i), transform.position.y);
            StartCoroutine(c.MoveObject(c.transform.position, target, 1));
            c.GetComponent<SpriteRenderer>().sortingOrder = i;

        }

希望他们一次移动一次,而不是一次全部移动

编辑:好吧,我有史以来最大的屁。...在将该方法设为协程之后,我忘记使用StartCoroutine()了,我一直想知道为什么它不会移动

1 个答案:

答案 0 :(得分:1)

要等待协程,您想将当前使用的方法更改为在协程中,然后像这样生成新的协程:

IEnumerator MyMethod() 
{
    for (int i = 0; i < CardsInHand.Count; i++)
    {
        Card c = CardsInHand[i];
        Vector3 target = new Vector3(startt + (1.5f * i), transform.position.y);
        yield return StartCoroutine(c.MoveObject(c.transform.position, target, 1)); 
        c.GetComponent<SpriteRenderer>().sortingOrder = i;
    }
}

来自{Everts的this答案:

  

创建协程时,Unity会将其附加到MonoBehaviour对象。它将首先在StartCoroutine上调用,直到达到产量为止。然后它将从协程返回并根据产量将其放置到堆栈上。