public class Storm : MonoBehaviour {

    [SerializeField] private PlayerVitals playerVitals;
    [SerializeField] private bool health;
    [SerializeField] private float value;

    public float waitTime = 1f;
    float timer;

    void Start () {
        InvokeRepeating ("OnTriggerEnter", 0.0f, 1.0f);
    }

    // Update is called once per frame
    void Update () {

        }
    IEnumerator OnTriggerEnter (Collider col)
    {
        if (col.gameObject.tag == "storm") {

            playerVitals.healthSlider.value -= value;
            yield return new WaitForSeconds (1);
        }
    }
    IEnumerator OnTriggerExit (Collider col){
        if (col.gameObject.tag == "storm") {

            playerVitals.healthSlider.value += value;
            yield return new WaitForSeconds (1);
        }
    }
}


我正在为一个小组项目编写代码,并试图获取该代码,以便当播放器位于触发器框中时,它每秒减少一次运行状况,并且每隔一秒它们就会跳出相同的数量。我的小组仅由设计师组成,因此编码对我来说有点困难,但是我必须看教程才能在此项目中学习其中的一些内容。 ps。我将此代码附加到播放器上,因此将其称为触发盒标签“ storm”。

最佳答案

首先,从启动功能中删除InvokeRepeating ("OnTriggerEnter", 0.0f, 1.0f);OnTriggerEnter函数由Unity自动调用。

OnTriggerEnterOnTriggerExit函数仅被调用一次。请注意,OnTriggerStay因无法工作sometimes而闻名,您应该避免使用它。这个站点上有无数关于此的帖子,here是一个示例。

由于您已将回调函数设置为IEnumerator,因此,实际上您可以在while循环中执行此操作,而不会冻结您的游戏,并且如果要在协程函数中按顺序进行操作,也可以不使用Update函数。调用OnTriggerEnter时,将标志设置为true,然后使用该标志跳入while循环。调用OnTriggerExit时,将该标志设置为false,并且while循环应自行退出。

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;
            }
        }

    }
}

09-26 07:16