【问题标题】:How to ensure that one coroutine completes before another is run?如何确保一个协程在另一个协程运行之前完成?
【发布时间】:2018-03-10 14:07:19
【问题描述】:

我有两个协程。一个有几个协程。在第二个协程在Start() 方法内运行之前,第一个协程不会等待第二个协程完成。请看下面的代码。

void Start() {
    StartCoroutine(DrawLineWithDuration (3.0f));
    StartCoroutine (changeLinePos (2.0f));
}

IEnumerator DrawLineWithDuration (float duration)  {

    lr.positionCount = 1;
    lr.SetPosition(0, GetPoint(0));

    float waitDur = duration / numPoints;

    for (int i = 1; i < numPoints + 1; i++) {
        float t = i / (float)numPoints;
        lr.positionCount = i+1;
        lr.SetPosition(i, GetPoint(t));

        yield return new WaitForSeconds(waitDur);
    }
}

IEnumerator moveToPosition1(Vector3 toPosition, float duration)
{

    float counter = 0;

    Vector3 startPos = points[1];

    while (counter < duration)
    {
        counter += Time.deltaTime;
        points[1] = Vector3.Lerp(startPos, toPosition, counter / duration);
        yield return null;
    }

}

IEnumerator moveToPosition2(Vector3 toPosition, float duration)
{
    float counter = 0;
    Vector3 startPos = points[2];

    while (counter < duration)
    {
        counter += Time.deltaTime;
        points[2] = Vector3.Lerp(startPos, toPosition, counter / duration);
        yield return null;
    }
}


IEnumerator moveToOriginal1(Vector3 toPosition, float duration)
{

    float counter = 0;

    Vector3 startPos = points[1];

    while (counter < duration)
    {
        counter += Time.deltaTime;
        points[1] = Vector3.Lerp(startPos, toPosition, counter / duration);
        yield return null;
    }

}

IEnumerator moveToOriginal2(Vector3 toPosition, float duration)
{
    float counter = 0;
    Vector3 startPos = points[2];

    while (counter < duration)
    {
        counter += Time.deltaTime;
        points[2] = Vector3.Lerp(startPos, toPosition, counter / duration);
        yield return null;
    }
}


IEnumerator changeLinePos(float waitTime)   {

    yield return new WaitForSeconds(waitTime);

    while (isRepeating) {
        StartCoroutine (moveToPosition1 (newPos1, moveDuration));
        StartCoroutine (moveToPosition2 (newPos2, moveDuration));
        yield return new WaitForSeconds (betweenPosMoveDelay);

        StartCoroutine (moveToOriginal1 (oriPos1, moveDuration));
        StartCoroutine (moveToOriginal2 (oriPos2, moveDuration));

        yield return new WaitForSeconds (betweenPosMoveDelay);
    }

}

Start() 内,我如何确保StartCoroutine(DrawLineWithDuration (3.0f));StartCoroutine (changeLinePos (2.0f)); 开始之前完成其给定的持续时间。同样在changeLinePos(float waitTime) 中,我如何确保moveToPosition1moveToPosition2moveToOriginal1moveToOriginal1moveToOriginal2 之前完成?

【问题讨论】:

    标签: unity3d coroutine


    【解决方案1】:

    其实很简单,可以yield return StartCoroutine(DrawLineWithDuration (3.0f));作为changeLinePos的第一行,像这样:

    void Start() {    
        StartCoroutine (ChangeLinePos (2.0f));
    }
    
    IEnumerator ChangeLinePos(float waitTime)   {
        yield return StartCoroutine(DrawLineWithDuration (3.0f));
        while (isRepeating) {
            StartCoroutine (MoveToOriginal1 (oriPos1, moveDuration));
            StartCoroutine (MoveToOriginal2 (oriPos2, moveDuration));
            yield return new WaitForSeconds (betweenPosMoveDelay);
        }
    }
    
    IEnumerator MoveToOriginal1(Vector3 toPosition, float duration) {
        yield return StartCoroutine (MoveToPosition1 (newPos1, moveDuration));
        //Rest of MoveToOriginal1 code
    }
    
    IEnumerator MoveToOriginal2(Vector3 toPosition, float duration) {
        yield return StartCoroutine (MoveToPosition2 (newPos2, moveDuration));
        //Rest of MoveToOriginal1 code
    }
    

    有了这个结构,时序如下:

    • ChangeLinePos 开始于 Start()
    • 第一行以DrawLineWithDuration 开始并停止ChangeLinePos 的执行,直到前者完成
    • DrawLineWithDuration完成时,如果isRepeating==true,代码同步启动MoveToOriginal1MoveToOriginal2
    • MoveToOriginal1MoveToOriginal2 都启动 MoveToPosition1MoveToPosition2 并等待最后两个完成。

    我离开了while,因为它似乎受到协程之外的东西的影响,所以请确保isRepeating在需要时更改为false,否则MoveToOriginal1MoveToOriginal2协程将被启动一直到应用程序停止为止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-30
      • 2020-11-07
      • 2021-01-01
      • 1970-01-01
      • 2018-10-29
      • 2021-12-28
      • 2022-01-11
      • 1970-01-01
      相关资源
      最近更新 更多