Все сердца здоровья исчезают, а не одно за другим, когда таймер обратного отсчета достигает нуля - PullRequest
1 голос
/ 25 октября 2019

Я создал игру-лабиринт с 3 сердцами здоровья и таймером обратного отсчета. когда таймер достигает нуля, он должен вычесть одно сердце и дать дополнительные 30 секунд, прежде чем вычесть другое. когда игрок на последнем сердце и таймер достигает нуля, игра заканчивается.

Моя проблема в том, что, когда таймер достигает нуля, он стирает все мои столбики здоровья, и игра заканчивается. Другой был то, что таймер обратного отсчета дает дополнительные 30 секунд, и все сердца исчезли, и таймер не показывает 30 секунд в тексте, и игра не заканчивается.

Я создал два скрипта, один для здоровья под названием LifeHeart.cs и один для таймера под названием Loading.cs. Я новичок в единстве, поэтому я реализовал эти коды из разных источников и сделал их своими собственными. В файле loading.cs показано, что если секунд таймера равно 0, а минут таймера равно 0, предполагается, что минус одно сердце, добавление дополнительных 30 секунд и запуск сопрограммы. В Lifeheart.cs есть случай переключения, показывающий, когда вычитается одно сердце, предполагается удалить одно сердце, установив для него значение false.

Я исследовал и обнаружил, что другие говорят, что статическая переменнаяэто причина того, что все сердца здоровья стираются, поэтому я изменил способ вызова переменной на gameobject.find, но это все равно не работает. чтобы сделать таймер обратного отсчета для предоставления дополнительных 30 секунд, я прокомментировал «Time.timeScale = 0;»в случае 0 в LifeHeart.cs он предоставляет 30 секунд, но сердца все уничтожены, и текст на таймере не показывает 30-секундный обратный отсчет.

Это первый скрипт кода изmy LifeHeart.cs - комментарии - это способы, которыми я пытался заставить его работать

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LifeHeart : MonoBehaviour
{
    public GameObject heart1;
    public GameObject heart2;
    public GameObject heart3;
    public static int health=3;

    // Start is called before the first frame update
    void Start()
    {

        health = 3;
        heart1.gameObject.SetActive(true);
        heart2.gameObject.SetActive(true);
        heart3.gameObject.SetActive(true);
    }

    // Update is called once per frame
    void Update()
    {
        if (health > 3)
            health = 3;

        switch (health)
        {
            case 3:
                heart1.gameObject.SetActive(true);
                heart2.gameObject.SetActive(true);
                heart3.gameObject.SetActive(true);
                break;

            case 2:
                heart1.gameObject.SetActive(true);
                heart2.gameObject.SetActive(true);
                heart3.gameObject.SetActive(false);
                break;

            case 1:
                heart1.gameObject.SetActive(true);
                heart2.gameObject.SetActive(false);
                heart3.gameObject.SetActive(false);
                break;

            case 0:
                heart1.gameObject.SetActive(false);
                heart2.gameObject.SetActive(false);
                heart3.gameObject.SetActive(false);
                //Time.timeScale = 0; //to make the extra 30 sec to work
                break;
        }
    }
}

//---------------------------------------------------------------------
//and this is second script of the code from my timer called Loading.cs
//---------------------------------------------------------------------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Loading : MonoBehaviour
{
    public Image loading;
    public Text timeText;
    public int minutes;
    public int sec;
    int totalSeconds = 0;
    int TOTAL_SECONDS = 0;
    float fillamount;

    void Start()
    {
        timeText.text = minutes + " : " + sec;
        if (minutes > 0)
            totalSeconds += minutes * 60;
        if (sec > 0)
            totalSeconds += sec;
        TOTAL_SECONDS = totalSeconds;
        StartCoroutine(second());
    }

    void Update()
    {
        //GameObject gameControl = GameObject.Find("GameControl");//name of my gameobject
        //LifeHeart LifeHeart = gameControl.GetComponent<LifeHeart>();
        if (sec == 0 && minutes == 0 && LifeHeart.health>0)
        {
            LifeHeart.health -= 1;
            totalSeconds += sec + 30;
            TOTAL_SECONDS = totalSeconds;
            StartCoroutine(second());
        }

        else if (sec == 0 && minutes == 0 && LifeHeart.health == 0)
        {
            timeText.text = "Time's Up!";//this one activates instead of showing the 30 seconds on the timer
            //Time.timeScale = 0;
            StopCoroutine(second());
        }
    }
    IEnumerator second()
    {
        yield return new WaitForSeconds(1f);
        if (sec > 0)
            sec--;
        if (sec == 0 && minutes != 0)
        {
            sec = 60;
            minutes--;
        }
        timeText.text = minutes + " : " + sec;
        fillLoading();
        StartCoroutine(second());
    }

    void fillLoading() // this is the code for the image of the timer clock
    {
        totalSeconds--;
        float fill = (float)totalSeconds / TOTAL_SECONDS;
        loading.fillAmount = fill;
    }
}
  • 1-я проблема: все сердца здоровья исчезают и игра останавливается

  • 2-я проблема: все сердца здоровья исчезают, но таймер дает 30 секунд, но не отображается в тексте таймера

Извините, если я сделал какие-либо ошибки. Ваша помощь очень ценится

1 Ответ

1 голос
/ 25 октября 2019

У вас много «секундных» переменных.

        if (sec == 0 && minutes == 0 && LifeHeart.health>0)
        {
            LifeHeart.health -= 1;
            totalSeconds += sec + 30;
            TOTAL_SECONDS = totalSeconds;
            StartCoroutine(second());
        }

Если sec равен 0, вы теряете жизнь и добавляете 30 к totalSeconds, но я не вижу, где вы добавляете 30 к sec. Поэтому следующее обновление sec будет по-прежнему равно нулю, и вы потеряете другую жизнь. Вы теряете сердце каждое Обновление, пока не умрете.

Быстрое исправление - добавление 30 к секундам одновременно с добавлением его к общему количеству секунд. Лучше посмотреть, действительно ли вам нужны sec, totalSeconds и TOTAL_SECONDS - можете ли вы объединить эти три в одну переменную? Кажется, что они должны иметь одинаковое значение, и проблема здесь в том, что они не имеют?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...