【发布时间】: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) 中,我如何确保moveToPosition1 和moveToPosition2 在moveToOriginal1 和moveToOriginal1 和moveToOriginal2 之前完成?
【问题讨论】: