无法让OnTriggerEnter循环播放

时间:2017-11-22 17:27:41

标签: javascript c# unity3d

<product>

我正在研究一个团队项目的代码,我正试图让它变得如此,以便当玩家进入触发器盒时,它会每秒降低生命值并且每秒都会恢复相同的数量。框。我的小组只由设计师组成,所以编码对我来说是一种挣扎,但我不得不观看教程来学习这个项目的一些内容。附:我将此代码附加到播放器上,因此它会调用标签&#34; storm&#34;这是触发器盒。

1 个答案:

答案 0 :(得分:2)

首先,从“开始”功能中删除InvokeRepeating ("OnTriggerEnter", 0.0f, 1.0f);。 Unity会自动调用OnTriggerEnter函数。

OnTriggerEnterOnTriggerExit函数仅调用一次。请注意,OnTriggerStay因无效sometimes而闻名,您应避免使用它。在这个网站上有无数关于此的帖子,here就是一个例子。

由于您将回调函数设为IEnumerator,因此您可以在while循环中实际执行此操作而不冻结游戏,如果您不想使用Update函数在协程功能中按顺序执行操作。调用OnTriggerEnter时,将标志设置为true,然后跳转到带有该标志的while循环。调用OnTriggerExit时,将该标志设置为falsewhile循环应退出。

bool triggerEntered = false;

IEnumerator OnTriggerEnter(Collider col)
{
    if (col.gameObject.tag == "storm")
    {
        triggerEntered = true;

        //Decrease while triggerEntered is true
        while (triggerEntered)
        {
            playerVitals.healthSlider.value -= value;
            yield return new WaitForSeconds(1);

            //Exit if we hit the min value?
            if (playerVitals.healthSlider.value <= 0)
            {
                yield break;
            }
        }
    }
}

IEnumerator OnTriggerExit(Collider col)
{
    if (col.gameObject.tag == "storm")
    {
        triggerEntered = false;

        //Increase while triggerEntered is false
        while (!triggerEntered)
        {
            playerVitals.healthSlider.value += value;
            yield return new WaitForSeconds(1);

            //Exit if we hit the max value?
            if (playerVitals.healthSlider.value >= 100)
            {
                yield break;
            }
        }

    }
}