服用 dmg 后如何创建自动 hp 再生脚本?

How do i create auto hp regeneration script after taking dmg?

我目前正在尝试编写一个自动 hp regenerate 脚本,类似于 halo 等游戏,在一段时间不服用 dmg 后你会恢复健康。它几乎可以工作,现在它会在服用 dmg 后 5 秒自动恢复 hp,但是如果我在那 5 秒内服用 dmg,它仍然会继续再生。

我在播放器脚本中创建了一个名为 可以重新生成=真;当玩家受到伤害时,此布尔值变为假。剩下的在下面的脚本中,它在 5 秒后再次将布尔值变为真。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using UnityEngine.Analytics;

public class HealthBarScript : MonoBehaviour {


    Image FullHearts;
    public float maxHealth = 100f;
    public static float health;
    public bool canRegen = false;


    // Use this for initialization
    void Start ()
    {
        FullHearts = GetComponent<Image>();
        health = maxHealth;
    }

    // Update is called once per frame
    void Update ()
    {
        FullHearts.fillAmount = health/maxHealth;
    }


    void FixedUpdate ()
    {
        if (Player1.canRegenerate == true && health < 100f)
        {
                health = health + 0.5f;
        }


        if (Player1.canRegenerate == false)
        {
            StartCoroutine(Regenerate());
        }
    }

    IEnumerator Regenerate()
    {
        yield return new WaitForSeconds(5);
            Player1.canRegenerate = true;


    }

}

现在,您可能正在启动多个协程,这些协程将等待 5 秒,然后将 canRegenerate 设置为 true。如果时机正确,多个协程调用将使玩家看起来总是会重新生成。

您需要防止协程被多次调用。

private bool CRRegenerateIsRunning = false;

void FixedUpdate ()
{
    if (Player1.canRegenerate && health < 100f)
    {
        health += 0.5f;
    }

    if (!Player1.canRegenerate && !CRRegenerateIsRunning)
    {
        StartCoroutine(Regenerate());
    }
}

IEnumerator Regenerate()
{
    CRRegenerateIsRunning = true;
    yield return new WaitForSeconds(5);

    Player1.canRegenerate = true;
    CRRegenerateIsRunning = false;
}