【问题标题】:Waiting for coroutine to finish before moving forward等待协程完成后再继续
【发布时间】:2019-11-01 09:21:23
【问题描述】:

所以我有一个将对象移动到一个地方的协程,我为一个对象列表执行此操作,但我希望它一个一个地移动它们(也就是等到前一个协程完成后再开始一个新的协程)但是添加任何产量只会阻止整个事情......我有点不知道为什么。

我尝试添加“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() 在使该方法成为协程之后……我一直想知道为什么它不会移动

【问题讨论】:

  • 你的循环是否也在协程中被调用?
  • @derHugo 如果是,它会完全停止移动

标签: c# unity3d


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

来自this@Everts 的回答:

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

【讨论】:

  • 似乎是一个很好的解决方案,但我不明白如何利用一个位置然后等待下一帧并返回 null 并不是协程的好用处
  • 诚实的问题:yield return null;yield return new WaitForEndOfFrame(); 之间的真正区别是什么?根据我的阅读,他们做同样的事情,但我在任何地方都找不到清晰、深入的答案。
  • @pravymravec 这些都每帧执行一次,但在更新循环中的不同点。您可以在这里找到详细信息:docs.unity3d.com/Manual/ExecutionOrder.html
  • Firstly, your Coroutine doesn't have anything worth making it a coroutine - 这不是真的......如果他愿意,OP 可以坚持使用yield return null; ......这是最常用的情况。正如 rutter 正确提到的那样,它只是在 Game Logic 执行块中的某处产生。您在特殊情况下使用WaitForEndOfFrame,您希望它等待执行某些操作,直到该帧的其他所有操作都完成。
  • 哦,我的错 - 我没有意识到 yield return null 会以与更新相同的速度执行。当我想在协程循环中模拟更新行为时,我总是使用 WaitForEndOfFrame()。谢谢,我将编辑答案并删除这部分,我学到了一些我以前误解的关于协程的东西!多么美好的一天!
猜你喜欢
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 2021-05-21
  • 1970-01-01
  • 2015-10-03
  • 2013-11-25
相关资源
最近更新 更多