Как уничтожать и порождать различные GameObjects в указанные секунды, используя сопрограммы? - PullRequest
1 голос
/ 30 мая 2019

Я работаю над развивающей детской игрой.Учебные материалы должны прокручиваться по горизонтали один за другим вместе с соответствующими аудиофайлами.Например, если изображение кошки находится на экране, то воспроизводится звук кошки.

Я пытаюсь использовать сопрограммы.Но GameObjects не уничтожаются по отдельности.Все ранее созданные GameObjects ожидают появления новых GameObject, и они уничтожаются сразу же после того, как все GameObject появляются.

[SerializeField] private GameObject[] sceneObjects;
[SerializeField] private int objectSlideSpeed;
[SerializeField] private int timer;
[SerializeField] private float targetLocation;

void Update()
{
    StartCoroutine(SlideLeft());
}

IEnumerator SlideLeft()
{
    for (int i = 0; i < sceneObjects.Length; i++)
    {
        while(sceneObjects[i].transform.position.x > targetLocation)
        {
            sceneObjects[i].transform.Translate(objectSlideSpeed * Time.deltaTime * Vector3.left);
            yield return new WaitForSeconds(timer);

            if (sceneObjects[i].transform.position.x < targetLocation)
            {
                StopSlide(); // objectSlideSpeed = 0;
                Destroy(sceneObjects[i]);
            }
        }
    }
}

Ожидается

  • Различные GameObjects должны появляться в каждую секунду, что указано в int timer.
  • Каждый GameObjects должен достигать целевой позиции трансформации.
  • В этой позиции GameObject должен ждать без какой-либо скорости, а затем воспроизводится соответствующий звук.(Функция Audio.Play() будет реализована в функции StopSlide() позже)

  • После воспроизведения звука GameObject должен быть уничтожен, а другой должен появиться.

  • Без уничтожения предыдущего GameObject новый не должен появляться.
  • Методы уничтожения и нереста не требуют никаких действий пользователя.Они происходят автоматически в зависимости от переменной timer.

Текущая ситуация

  • Первый GameObject создается и достигает целевой позиции преобразования, указанной в float targetLocation переменная.
  • В этот момент первый GameObject ожидает в течение указанной секунды без какой-либо скорости.
  • Между тем, новый и другой GameObject порождается, и после того, как он достигает целевого местоположения, все порожденные GameObjects полностью уничтожаются.

preview

1 Ответ

0 голосов
/ 30 мая 2019
[SerializeField] private GameObject[] sceneObjects;
[SerializeField] private int objectSlideSpeed;
[SerializeField] private int timer;
[SerializeField] private float targetLocation;

// When the scene loads, you dont want update or else the coroutine will be called every frame
void Start()
{
    StartCoroutine(SlideLeft());
}

IEnumerator SlideLeft()
{
    for (int i = 0; i < sceneObjects.Length; i++)
    {
        // [Here], on while we check the conidtion and if it is not true we dont step into it
        while(sceneObjects[i].transform.position.x > targetLocation)
        {
            sceneObjects[i].transform.Translate(objectSlideSpeed * Time.deltaTime * Vector3.left);
            // Why you need a timer, if your goal is to start a gameobject when the other one arrived,
            // at its destination? O.o
            // yield return new WaitForSeconds(timer);

            yield return null; // After this yield execution will continue on the [Here] Tag
        }
        StopSlide();
        Destroy(sceneObjects[i]);
    }
}

Есть некоторые вещи, которые я не понимаю в вашем ожидаемом поведении, но напишите комментарий, если я что-то не так понял.

И причина, по которой это работает, потому что вы назвали ихв обновлении, но вы как будто создали миллион сопрограмм, и сотни тысяч были в приостановленном исполнении.

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