Unity: LoadScene не работает при срабатывании таймера - PullRequest
0 голосов
/ 14 февраля 2019

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

До того, как у меня появился звук, пьеса мгновенно умерла после вызова функции death ():

public static void Death()
{
    AddCoinScript.coinCounter = 0;
    LivesScript.livesCounter--;

        if (LivesScript.livesCounter > -1)//to get 0 live
        {
            Debug.Log("TIMER");

            var currentScene = SceneManager.GetActiveScene();
            SceneManager.LoadScene(currentScene.name);
        }
        else
        {
            //TO DO GameOver
        }

}

Это работало как заклинание.Но теперь я добавил звук смерти.К сожалению, Unity не предоставляет обработчик событий для воспроизведения звука (я хочу, чтобы сцена перезагружалась не сразу, а после воспроизведения звука смерти), поэтому я решил взять это на себя, чтобы просто создатьтаймер.Таймер срабатывает сразу после смерти.Вот что эта функция стала:

public static void Death()
{
    AddCoinScript.coinCounter = 0;
    LivesScript.livesCounter--;

    PlayDeathSound();

    System.Timers.Timer timer = new System.Timers.Timer();
    timer.Interval = aSDeath.clip.length * 1000;
    timer.Start();

    timer.Elapsed += delegate
    {
        timer.Stop();

        if (LivesScript.livesCounter > -1)//to get 0 live
        {
            Debug.Log("TIMER");

            var currentScene = SceneManager.GetActiveScene();
            SceneManager.LoadScene(currentScene.name);
        }
        else
        {
            //TO DO GameOver
        }
    };
}

Как вы можете видеть, чтобы убедиться, что таймер действительно срабатывает, я установил "debug.Log (" TIMER ")", чтобы увидеть, действительно ли онработает.И угадайте, что: это делает.Отладка теперь показывает «ТАЙМЕР» в своей консоли.Но вы знаете, что больше не работает?Две строки кода прямо под этим.

            var currentScene = SceneManager.GetActiveScene();
            SceneManager.LoadScene(currentScene.name);

Это те же самые строки, которые работали как раз перед тем, но когда они запускаются из таймера, они просто игнорируются?Как это вообще возможно?Когда я все это снова изменяю, это снова работает.Только когда таймер запускает две строки, они игнорируются.

Это совершенно странно или я что-то упустил?Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

А как насчет использования сопрограммы?Вы просто запускаете его, когда игрок умирает, и уступаете, пока ваш звук все еще играет.

0 голосов
/ 14 февраля 2019

Хорошо, я не эксперт по C # и делегату, но, очевидно, он создает отдельный поток, и вы можете использовать SceneManager.GetActiveScene только в основном потоке.

Поскольку я не уверен насчет delegate, я предложу более простое решение.Вы можете использовать сопрограмму, так как вы знаете, сколько вам нужно ждать, как это:

public void Death()
{
    StartCoroutine(DeathCoroutine());
}
IEnumerator DeathCoroutine()
{      

    AddCoinScript.coinCounter = 0;
    LivesScript.livesCounter--;
    PlayDeathSound();
    // wait for duration of the clip than continue executing rest of the code
    yield return new WaitForSeconds(aSDeath.clip.length);

    if (LivesScript.livesCounter > -1)//to get 0 live
    {
        Debug.Log("TIMER");

         var currentScene = SceneManager.GetActiveScene();
         SceneManager.LoadScene(currentScene.name);
    }
    else
    {
         //TO DO GameOver
    }

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