Unity:从计时器触发时,LoadScene不起作用

时间:2019-02-14 12:09:42

标签: unity3d

在我的游戏中,当玩家死亡时,会播放垂死的声音,并且一旦声音结束,应该在用户还有足够的生命时重新加载场景。

在我听到声音之前,该剧本在调用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
        }

}

这就像一种魅力。 但是现在我给它添加了死亡音。不幸的是,当声音播放完毕时,团结并没有提供事件处理程序(我希望不再立即重新加载场景,而是在播放死亡声音之后才重新加载场景),因此我决定自己制作一个计时器。死亡声音结束后,计时器立即触发。这就是这个功能变成的:

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”)“以查看其是否真正起作用。猜猜是什么:确实如此。现在,调试在其控制台中显示“ TIMER”。但是你知道什么不再起作用了吗?在其下方的两行代码。

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

这与之前的工作完全相同-但是从计时器中触发时,它们会被忽略吗?这怎么可能? 当我把它全部改回来时,它又可以工作了。只有当计时器触发两条线时,它们才会被忽略。

这完全是奇怪的,还是我错过了什么?谢谢!

2 个答案:

答案 0 :(得分:3)

好的,我不是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
    }

}

答案 1 :(得分:1)

使用协程怎么样?您只需在播放器死亡时启动它,然后在声音仍在播放时就屈服。