服用 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;
}
我目前正在尝试编写一个自动 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;
}