Как мне создать скрипт автоматической регенерации hp после приема dmg? - PullRequest
0 голосов
/ 21 декабря 2018

В настоящее время я пытаюсь написать скрипт автоматического восстановления hp, похожий на игры типа halo, в которых вы восстанавливаете здоровье после некоторого времени, когда вы не принимаете dmg.Он почти работает, сейчас он автоматически восстанавливает hp через 5 секунд после получения dmg, однако, если я принимаю dmg в течение этих 5 секунд, он все еще продолжает восстанавливаться.

Я создал статическое логическое значение в сценарии проигрывателя canRegenerate = true;Это логическое значение становится ложным, когда игрок получает урон.Остальное в приведенном ниже скрипте, оно снова переводит логическое значение в true через 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;


    }

}

1 Ответ

0 голосов
/ 21 декабря 2018

Прямо сейчас вы, возможно, запускаете несколько сопрограмм, которые будут ждать 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;
}
...