Я создал игру-лабиринт с 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 секунд, но не отображается в тексте таймера
Извините, если я сделал какие-либо ошибки. Ваша помощь очень ценится