Можно ли сделать перезапуск уровня, когда уничтожается один из игроков?
Ребята, помогите! Суть в чем: У меня есть два игрока, которые при столкновении с врагом уничтожаются, но перезапуск уровня не происходит! Если удалить в коде момент 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 шт):
Да. У меня тоже была такая проблема, пока я не разобрался нормально с корутинами.На всякий случай дам ссылку.
ЧТО ТАКОЕ КОРУТИНА: Корутина при вызове может выжидать определенное время, после чего выполнять свой код. ПРИЧЕМ, тот код, откуда она была вызвана продолжает выполнение. В данном случае ваш код работает так:
- Срабатывает метод
OnCollisionEnter(), срабатывает проверка if - Срабатывает функция
Instantiate() - Вызывается корутина
WaitForIt() - Корутина ЖДЕТ 1 секунду, НО код в методе
OnColisionEnter()продолжает выполнение, из-за чего срабатывает функцияDestroy(), удаляющая объект на котором висит этот скрипт. Объект удален - корутина не успевает сработать, так как 1 секунда, которую она должна была ждать, еще не прошла. В итоге ваш объект просто удаляется.
Просто поймите, что при вызове корутины, код в том месте, где вы ее вызвали, продолжает выполнение, в то время как корутина делает что-то свое или, допустим, ждет.
Ваш код исправляется простейшим образом: просто перетаскиваем строку Destroy(gameObject); в конец корутины. Теперь корутина будет ждать секунду, загружать сцену и удалять объект.
Я вам более того скажу, вам можно (хотя на 100% я не уверен) вообще удалить функцию Destroy(), т.к. при выполнении команды SceneManager.LoadScene ваша сцена полностью перезагружается, такчто объекты на старой сцене удалятся сами собой.