Ожидание завершения сопрограммы, прежде чем двигаться вперед - PullRequest
1 голос
/ 18 июня 2019

Итак, у меня есть эта сопрограмма, которая перемещает объект в определенное место, и я делаю это для списка объектов, но я хочу, чтобы он перемещал их один за другим (то есть дождался, пока предыдущая сопрограмма не будет сделана, прежде чем начинать новую) но добавление любых выходов просто останавливает все это ... я немного растерялся, почему.

Я пытался добавить «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 () после того, как сделал метод сопрограммой ... и я продолжал задаваться вопросом, почему он не будет двигаться

1 Ответ

1 голос
/ 18 июня 2019

Чтобы дождаться сопрограммы, вы хотите изменить метод, в котором вы находитесь в данный момент, на сопрограмму, а затем вывести новую сопрограмму следующим образом:

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, пока не будет достигнут доход.Затем он вернется из сопрограммы и поместит его в стек на основе доходности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...