在循环中一步步启动协程

Start Coroutine step-after-step in loop

我有一个包含游戏对象的列表(称为路径)。当前游戏对象(附有脚本)应该从路径中游戏对象的一个​​位置逐步移动到下一个位置。我当前的代码使它立即移动到路径的最后一个位置。我已经在 Coroutine 的末尾尝试了 WaitForSeconds 但是因为它们都是同时启动的,所以它没有效果。

怎样做才能得到步进效果?

这里是我的代码:

public List<GameObject> path;
private Vector3 start;
private Vector3 target;
private float lungeSpeed = .8f;
private float lungeDistance = 5;
private IEnumerator coroutine;

public void StartPath() {
        foreach (GameObject field in path) {
            start = transform.position;
            target = new Vector3(field.transform.position.x + lungeDistance, field.transform.position.y, field.transform.position.z);
            coroutine = MoveObject(start, target, lungeSpeed);
            StartCoroutine(coroutine);
        }
    }

IEnumerator MoveObject(Vector3 start, Vector3 target, float speed)
    {
        float t = 0.0f;
        float rate = 1.0f / speed;
        while (t < 1.0)
        {
            t += Time.deltaTime * rate;
            transform.position = Vector3.Lerp(start, target, t);
            yield return null;
        }
        yield return new WaitForSeconds(1);
    }

现在您在 StartPath 中的代码没有等待 MoveObject 完成。您可以通过 运行ning StartPath 在协程中解决这个问题并使用 yield return MoveObject(start, target, lungespeed)

仍然会在 startPath 中停止执行 foreach 循环,直到 MoveObject 完成 yield return new WaitForSeconds

public IEnumerator StartPath() {
    foreach (GameObject field in path) {
        start = transform.position;
        target = new Vector3(field.transform.position.x + lungeDistance, field.transform.position.y, field.transform.position.z);
        coroutine = MoveObject(start, target, lungeSpeed);
        yield return StartCoroutine(coroutine);//this will keep the foreach loop from iterating untill the coroutine has finished
    }
}

还有一点旁注:

(because the coroutine is executed in a new parallel thread)

不正确。协同程序在单独的线程上执行 not 运行。主线程上的协程 运行s 与所有其他代码一样,它只是做了一个小技巧,它根据你的 yield 语句暂停和恢复执行,但仍在主线程上。

如果您想 运行 在单独的线程上执行某些操作,您需要调用 new Thread()。然而,这是一个完全不同的小菜一碟,因为线程不能继承自 Monobehaviour