Unity: CountDownTimer, чтобы остановить, когда он достигает 00:00:00 - PullRequest
0 голосов
/ 20 марта 2020

поэтому у меня есть этот код, который в основном является таймером обратного отсчета, моя проблема в том, что я хочу, чтобы он остановился, когда он достигнет 00: 00: 00.

в настоящее время, когда код достигает 00:00:00 секунды начинают отсчитываться снова с 00:00:59, поэтому я надеюсь, что найдется кто-нибудь, кто сможет мне помочь.

public class CountDownTimer : MonoBehaviour
 {
     public Text timerText;
     public float secondsCount;
     public int minuteCount;
     public int hourCount;
     void Update()
     {
         UpdateTimerUI();
     }
     //call this on update
     public void UpdateTimerUI()
     {
         //set timer UI
         if(secondsCount > 0)
         secondsCount -= Time.deltaTime;
         timerText.text = hourCount + "h:" + minuteCount + "m:" + (int)secondsCount + "s";
         if (secondsCount <= 0)
         {
             if(minuteCount > 0)
             minuteCount--;

             //if(minuteCount!= 0)
             secondsCount = 60;

         }

         else if (minuteCount <= 0)
         {
             if(hourCount > 0)
             hourCount--;

             if(hourCount != 0)
             minuteCount = 60;
         }

          if (secondsCount <= 0 && minuteCount <= 0 && hourCount <= 0)
         {
             Debug.Log("gameOver");
         }
     }
 }

Ответы [ 3 ]

0 голосов
/ 20 марта 2020

Эта часть сбрасывает ваш таймер.

 if (secondsCount <= 0)
     {
         if(minuteCount > 0)
         minuteCount--;

         //if(minuteCount!= 0)
         secondsCount = 60;

     }

Если вы хотите, чтобы ваш таймер фиксировался на 0, просто скажите

if(secondsCount <=){
    secondsCount = 0;
}

Если вы не хотите, чтобы он начинался заново, просто удалите строку

secondsCount = 60; 

или вы можете добавить bool, который записывает состояние ваших часов.

bool timeIsOver = false;

, а затем активируйте его, когда пройдут секунды.

if(timeIsOver == false){
secondsCount -= Time.deltaTime;
}
if(secondsCount <= 0  ){
   timeIsOver = true;
}
0 голосов
/ 20 марта 2020

я нашел другой ответ и подумал, что он может пригодиться всем, кто проходит мимо

public Text timerText;
 [SerializeField, Range(0, 59)] private int seconds;
 [SerializeField, Range(0, 59)] private int minutes;
 [SerializeField, Range(0, 23)] private int hours;
 private float timer;
 private void Start()
 {
     timer = hours * 3600f + minutes * 60 + seconds;
 }
 void Update()
 {
     UpdateTimerUI();
 }
 //call this on update
 public void UpdateTimerUI()
 {
     timer = Mathf.Max(timer - Time.deltaTime, 0);
     hours = Mathf.FloorToInt(timer / 3600);
     minutes = Mathf.FloorToInt((timer - hours * 3600) / 60);
     seconds = Mathf.FloorToInt(timer - hours * 3600 - minutes * 60);
     timerText.text = string.Format("{0:00}h:{1:00}m:{2:00}s", hours, minutes, seconds);
     if (timer <= Mathf.Epsilon)
     {
         Debug.Log("gameOver");
         enabled = false;
     }
 }
0 голосов
/ 20 марта 2020

Я переписал его, используя сопрограммы и TimeSpan (псевдокод):

private IEnumerator Countdown(int totalSeconds)
{
   while (totalSeconds > 0)
   {
     var time = TimeSpan.FromSeconds(totalSeconds);
     timerText.text = $"{time.Hours}:{time.Minutes}:{time.Seconds}";
     yield return new WaitForSeconds(1);
     totalSeconds--;
   }

   Debug.Log("Game over");
}
...