Можно ли сделать перезапуск уровня, когда уничтожается один из игроков?

Ребята, помогите! Суть в чем: У меня есть два игрока, которые при столкновении с врагом уничтожаются, но перезапуск уровня не происходит! Если удалить в коде момент Destroy, то уровень перезапускается. Что делать??

 private void OnCollisionEnter2D(Collision2D other)
    { 
        if (other.gameObject.tag == "Enemy")
            {
               
               Instantiate(deathplayer, transform.position, Quaternion.identity);
               StartCoroutine (WaitForIt (1.0F)); 
               Destroy(gameObject);

            }
    }   
           
     IEnumerator WaitForIt(float waitTime)
        {
        yield return new WaitForSeconds(waitTime);
        SceneManager.LoadScene(SceneManager.GetActiveScene().name);
        }

Ответы (1 шт):

Автор решения: Максим Фисман

Да. У меня тоже была такая проблема, пока я не разобрался нормально с корутинами.На всякий случай дам ссылку.

ЧТО ТАКОЕ КОРУТИНА: Корутина при вызове может выжидать определенное время, после чего выполнять свой код. ПРИЧЕМ, тот код, откуда она была вызвана продолжает выполнение. В данном случае ваш код работает так:

  1. Срабатывает метод OnCollisionEnter(), срабатывает проверка if
  2. Срабатывает функция Instantiate()
  3. Вызывается корутина WaitForIt()
  4. Корутина ЖДЕТ 1 секунду, НО код в методе OnColisionEnter() продолжает выполнение, из-за чего срабатывает функция Destroy(), удаляющая объект на котором висит этот скрипт. Объект удален - корутина не успевает сработать, так как 1 секунда, которую она должна была ждать, еще не прошла. В итоге ваш объект просто удаляется.

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

Ваш код исправляется простейшим образом: просто перетаскиваем строку Destroy(gameObject); в конец корутины. Теперь корутина будет ждать секунду, загружать сцену и удалять объект.

Я вам более того скажу, вам можно (хотя на 100% я не уверен) вообще удалить функцию Destroy(), т.к. при выполнении команды SceneManager.LoadScene ваша сцена полностью перезагружается, такчто объекты на старой сцене удалятся сами собой.

→ Ссылка