Tutorial de contagem regressiva para Unity

Um cronômetro de contagem regressiva é um relógio virtual que conta a partir de um horário definido até 0.

Para fazer uma contagem regressiva em Unity, você precisará criar um script que armazenará a quantidade de tempo que será contada e exibirá em 00:00 formatar.

Cronômetro de contagem regressiva do Unity no canto superior esquerdo.

O cronômetro apresentará estes formatos:

  • Dias: Horas: Minutos: Segundos: Milissegundos
  • Horas: Minutos: Segundos: Milissegundos
  • Minutos: Segundos: Milissegundos
  • Segundos: Milissegundos
  • Além de tudo isso, mas sem milissegundos

Passos

Para fazer uma contagem regressiva em Unity, siga as etapas abaixo:

  • Crie um novo script, chame-o de 'SC_CountdownTimer', remova tudo dele e cole o código abaixo:
  • O script de contagem regressiva C# subtrairá do valor total até chegar a 0 e aplicará o tempo formatado a um elemento Text.

SC_CountdownTimer.cs

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

public class SC_CountdownTimer : MonoBehaviour
{
    public enum CountdownFormatting { DaysHoursMinutesSeconds, HoursMinutesSeconds, MinutesSeconds, Seconds };
    public CountdownFormatting countdownFormatting = CountdownFormatting.MinutesSeconds; //Controls the way the timer string will be formatted
    public bool showMilliseconds = true; //Whether to show milliseconds in countdown formatting
    public double countdownTime = 600; //Countdown time in seconds

    Text countdownText;
    double countdownInternal;
    bool countdownOver = false;

    // Start is called before the first frame update
    void Start()
    {
        countdownText = GetComponent<Text>();
        countdownInternal = countdownTime; //Initialize countdown
    }

    void FixedUpdate()
    {
        if (countdownInternal > 0)
        {
            countdownInternal -= Time.deltaTime;

            //Clamp the timer value so it never goes below 0
            if (countdownInternal < 0)
            {
                countdownInternal = 0;
            }

            countdownText.text = FormatTime(countdownInternal, countdownFormatting, showMilliseconds);
        }
        else
        {
            if (!countdownOver)
            {
                countdownOver = true;

                Debug.Log("Countdown has finished running...");

                //Your code here...
            }
        }
    }

    string FormatTime(double time, CountdownFormatting formatting, bool includeMilliseconds)
    {
        string timeText = "";

        int intTime = (int)time;
        int days = intTime / 86400;
        int hoursTotal = intTime / 3600;
        int hoursFormatted = hoursTotal % 24;
        int minutesTotal = intTime / 60;
        int minutesFormatted = minutesTotal % 60;
        int secondsTotal = intTime;
        int secondsFormatted = intTime % 60;
        int milliseconds = (int)(time * 100);
        milliseconds = milliseconds % 100;

        if (includeMilliseconds)
        {
            if (formatting == CountdownFormatting.DaysHoursMinutesSeconds)
            {
                timeText = string.Format("{0:00}:{1:00}:{2:00}:{3:00}:{4:00}", days, hoursFormatted, minutesFormatted, secondsFormatted, milliseconds);
            }
            else if (formatting == CountdownFormatting.HoursMinutesSeconds)
            {
                timeText = string.Format("{0:00}:{1:00}:{2:00}:{3:00}", hoursTotal, minutesFormatted, secondsFormatted, milliseconds);
            }
            else if (formatting == CountdownFormatting.MinutesSeconds)
            {
                timeText = string.Format("{0:00}:{1:00}:{2:00}", minutesTotal, secondsFormatted, milliseconds);
            }
            else if (formatting == CountdownFormatting.Seconds)
            {
                timeText = string.Format("{0:00}:{1:00}", secondsTotal, milliseconds);
            }
        }
        else
        {
            if (formatting == CountdownFormatting.DaysHoursMinutesSeconds)
            {
                timeText = string.Format("{0:00}:{1:00}:{2:00}:{3:00}", days, hoursFormatted, minutesFormatted, secondsFormatted);
            }
            else if (formatting == CountdownFormatting.HoursMinutesSeconds)
            {
                timeText = string.Format("{0:00}:{1:00}:{2:00}", hoursTotal, minutesFormatted, secondsFormatted);
            }
            else if (formatting == CountdownFormatting.MinutesSeconds)
            {
                timeText = string.Format("{0:00}:{1:00}", minutesTotal, secondsFormatted);
            }
            else if (formatting == CountdownFormatting.Seconds)
            {
                timeText = string.Format("{0:00}", secondsTotal);
            }
        }

        return timeText;
    }
}
  • Crie um novo texto de UI, clicando com o botão direito na visualização Hierarquia -> UI -> Texto e nomeie-o 'Countdown'

Unity cria novo texto de UI

  • Altere o alinhamento de 'Countdown' Rect Transform para o canto superior esquerdo, gire para (0, 1), Pos X e Pos Y para 5, Largura para 300 e Altura para 60

  • Altere o estilo da fonte do texto 'Countdown' para negrito, o tamanho da fonte para 34, o alinhamento para o centro esquerdo e a cor para branco

Unity Text Component Inspector Arial Bold Fonte Tamanho 34

  • Anexe o script SC_CountdownTimer ao objeto 'Countdown' que possui um componente Text.

Você notará que o script tem algumas variáveis:

  • Formatação de contagem regressiva controla quais unidades de tempo serão incluídas na formatação da string.
  • Mostrar milissegundos controla se a contagem de milissegundos deve ser mostrada.
  • Tempo de contagem regressiva é a duração da contagem regressiva em segundos, por exemplo, o valor 600 corresponde a 10 minutos.

Depois de pressionar Play você deverá notar o texto preenchido com uma contagem regressiva:

Em 0 segundos o script imprimirá uma linha no console, sinalizando que a contagem regressiva terminou, use essa parte do script para adicionar sua própria funcionalidade.

Artigos sugeridos
Script para criar um interruptor de luz no Unity
Script de tiro com arma baseado em Raycast e projéteis para Unity
Como configurar o controlador de joystick para movimento no Unity
Tutorial de ataque corpo a corpo 2D para Unity
Editor de mapa de altura de terreno no jogo para Unity
Scripts de porta para Unity
FPC Swimmer - Um ativo de unidade abrangente para ambientes aquáticos imersivos