' yield会返回新的WaitForSeconds(4.0f)'要充电吗?

时间:2017-03-02 13:45:00

标签: c# unity3d ienumerator

我正在制作第一人称射击游戏。

我希望我的枪重新加载,然后播放动画,4秒后将显示子弹数量。但有时它会这样做,有时它不会等待并立即显示子弹而不播放动画。

IEnumerator waitForReload()
{
    if (reloadNow==true && !gun.GetComponent<Animation>().IsPlaying("Reload"))
    {
        animator.SetInteger ("Anumber", reload);
        yield return new WaitForSeconds (4.0f);
        reloadNow = false;
        displayBullets (); 
    }
}

2 个答案:

答案 0 :(得分:1)

我建议不要使用动画组件,你将在动画师之后。他们做类似的事情,除了Animator是Unity的更新和更多改进的版本。抓取动画组件并检查IsPlaying不会告诉您动画是否正在播放,因为动画正在通过Animator组件播放。

要检查的第一件事是你的惯例,你多久开枪一次?内部的逻辑是合理的,但是,如果要重新加载,理想情况下不会再次启动协同例程。

共同例程中的收益是神奇发生的地方。每次你屈服时,函数都会记住它的位置,所以当你再次执行这个函数时,它会从你离开的地方开始。每次调用StartCoroutine时,都会创建一个新例程。

因此,如果您不小心再次启动协同例程,您将运行多个实例,这就是为什么它可能在某些地方出现故障。 我建议打扰一些调试,把一个放在你开始协同例程的地方,一个放在你完成的时候。如果您的控制台被垃圾邮件发送,那么您就知道自己错误地启动了控制台并且要么在不应该启动它时停止它,或者通过启动协同程序来停止它,如果您的检查结果是号

if(reloading == false)
{
     reloading = true; 
     StartCoroutine(waitForReload());
}
else
{
    //do nothing
}

IEnumerator waitForReload()
{
    //your custom reload logic here
    reloading = false;

    //set reloading to false so we can reload again later, after the time is up in your case
}

这些方面的某些内容应该能够为您提供预期的结果。

对于yield命令,这里有一个参考 https://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx

对于动画组件: https://docs.unity3d.com/ScriptReference/Animator.GetCurrentAnimatorClipInfo.html

这将给你回放正在播放的当前动画片段,这样你就可以检查名字了。

希望这会引导你朝着正确的方向前进。

答案 1 :(得分:0)

我认为问题出现是因为你的协程运行了不止一次,试试这个(假设你的动画是4秒长)

IEnumerator waitForReload()
{
    if (reloadNow)
    {
        animator.SetInteger ("Anumber", reload);
        reloadNow = false;
        yield return new WaitForSeconds (4.0f);
        displayBullets (); 
    }
}

或者最好你可以调用在动画结尾显示项目符号的功能

Aniamtion event