在我的游戏中,当玩家死亡时,会播放垂死的声音,并且一旦声音结束,应该在用户还有足够的生命时重新加载场景。
在我听到声音之前,该剧本在调用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);
这与之前的工作完全相同-但是从计时器中触发时,它们会被忽略吗?这怎么可能? 当我把它全部改回来时,它又可以工作了。只有当计时器触发两条线时,它们才会被忽略。
这完全是奇怪的,还是我错过了什么?谢谢!
答案 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)
使用协程怎么样?您只需在播放器死亡时启动它,然后在声音仍在播放时就屈服。