Запуск Coroutine шаг за шагом в цикле - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть список (называемый путь) с GameObjects. Текущий GameObject (с прикрепленным сценарием) должен перемещаться от одной позиции GameObjects на пути к следующему шагу. Мой текущий код заставляет его сразу перейти к последней позиции пути. Я уже пробовал с 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);
    }

1 Ответ

0 голосов
/ 04 ноября 2018

Прямо сейчас ваш код в StartPath не ждет завершения MoveObject. Вы можете решить эту проблему, запустив StartPath в сопрограмме и используя yield return MoveObject(start, target, lungespeed).

Все равно остановит выполнение цикла foreach в startPath до тех пор, пока 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
    }
}

также небольшое примечание:

(поскольку сопрограмма выполняется в новом параллельном потоке)

Неверно. Сопрограммы не работают в отдельном потоке. Сопрограмма запускается в основном потоке, как и весь остальной код, она просто делает небольшую хитрость, когда приостанавливает и возобновляет выполнение на основе ваших операторов yield, но все же в основном потоке.

Если вы хотите запустить что-то в отдельном потоке, вам нужно позвонить new Thread(). Однако это совсем другой кусок пирога, поскольку нить не может наследовать от монобихи

...