【问题标题】:Does 'yield return new WaitForSeconds(4.0f)' have to charge?'yield return new WaitForSeconds(4.0f)' 是否必须收费?
【发布时间】:2017-03-02 13:44:59
【问题描述】:

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

我想让我的枪重新装弹,播放动画,4 秒后会显示子弹数量。但有时它会,有时它不会等待并立即显示子弹而不播放动画。

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

【问题讨论】:

  • “'yield return new WaitForSeconds(4.0f)' 必须收费吗?”是什么意思?
  • 我的意思是 waitforseconds 需要经过 4 才能让他再次工作。
  • WaitForSeconds 放置在哪里,它会在哪里暂停设置秒数?这意味着它会在函数调用时立即点击 animator.SetInteger,然后等待 4 秒,然后将 reloadNow 设置为 false 并调用 displayBullets 函数。
  • 你在哪里调用这个waitforReload?

标签: c# unity3d ienumerator


【解决方案1】:

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

首先要检查的是你的协同例程,你多久解雇一次?里面的逻辑是合理的,但是,如果您正在重新加载,最好不要再次启动协同程序。

协程中的 yield 是魔法发生的地方。每次屈服时,该函数都会记住它的位置,因此当您再次执行该函数时,它将从您离开的地方开始。每次调用 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

这将返回当前正在播放的动画剪辑,因此您可以通过这种方式检查名称。

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

【讨论】:

    【解决方案2】:

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

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

    或者最好你可以调用在动画结束时显示子弹的函数

    【讨论】:

    • 好的,但如果我尝试,没有可用的功能。
    • 负责显示子弹的类应该附加到与动画师附加到相同的游戏对象上
    • 我删除了 waitforseconds 方法,并将其替换为动画事件。但现在我有另一个问题。顺便说一句,对不起我的英语不好,我是荷兰人。无论如何,它有时会起作用,但有时我的游戏的所有动画都会停止并且子弹不显示。
    猜你喜欢
    • 2012-10-14
    • 1970-01-01
    • 2019-06-19
    • 2018-11-09
    • 2016-06-15
    • 2018-12-18
    • 1970-01-01
    • 2012-03-05
    • 2015-03-02
    相关资源
    最近更新 更多