Da formato a los números
Parte de la sección Creación de juegos reales del Journey de Unity de Coddy. Lección 3 de 56.
Un número unido a una cadena se muestra tal como lo escribe C#: un temporizador muestra 12.34567, y un número de punto flotante que vale 2 muestra 2, sin decimales. Una cadena de formato en ToString() determina cómo se ve. Cada 0 en ella representa un dígito que siempre se escribe: 7.ToString("000") es 007, y 41.27f.ToString("0.0") es 41.3, redondeado a un decimal. En la interpolación de cadenas, el mismo formato va después de dos puntos: $"{coins:000}", $"{topSpeed:0.0} m/s".
Los tiempos se leen mejor como minutos y segundos. Primero convierte el tiempo a int, lo que elimina la parte fraccionaria; después, la división entera entre 60 da los minutos completos y % 60 los segundos restantes. Una vuelta de 83.46 segundos:
float lapTime = 83.46f;
int total = (int)lapTime; // 83
int minutes = total / 60; // 1
int seconds = total % 60; // 23
lapText.text = $"Lap: {minutes}:{seconds:00}"; // Vuelta: 1:23El 00 mantiene dos dígitos: sin él, una vuelta de 64 segundos se mostraría como 1:4 en lugar de 1:04. Y como (int) elimina la parte fraccionaria en vez de redondear, 59.7 segundos se muestra como 0:59; si se redondeara, mostraría 0:60 por un instante.
Desafío
FácilEl Scoreboard.cs de la sala de juegos muestra sus números sin formato. Al pulsar la barra espaciadora, se suman 100 puntos multiplicados por el combo y el combo aumenta en 0.5; playTime cuenta los segundos jugados (el Inspector lo inicia en 47.5). Mantén el conteo tal como está y cambia cómo se escriben los tres textos:
scoreText: la puntuación con seis dígitos, comoScore: 000450.comboText: el combo con un decimal, comoCombo: x2.5, yCombo: x1.0al inicio.timeText: minutos y segundos enteros, comoTime: 2:07. Los segundos siempre tienen dos dígitos y nunca se redondean hacia arriba.
Pulsa Play, consigue puntos varias veces y después pulsa Check.
Pruébalo tú mismo
using UnityEngine;
using TMPro;
public class Scoreboard : MonoBehaviour
{
public TMP_Text scoreText;
public TMP_Text comboText;
public TMP_Text timeText;
public int score;
public float combo = 1f;
public float playTime;
void Update()
{
playTime += Time.deltaTime;
if (Input.GetKeyDown(KeyCode.Space))
{
score += (int)(100 * combo);
combo += 0.5f;
}
scoreText.text = "Score: " + score;
comboText.text = "Combo: x" + combo;
timeText.text = "Time: " + playTime;
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Creación de juegos reales
1Texto en pantalla
Canvas y textoMuestra la puntuaciónDa formato a los númerosUn temporizador de cuenta regresivaRepaso: velocímetro4Escenas y niveles
Cargar una escenaReiniciar el nivelSiguiente nivelConservar entre escenasRepaso: selección de nivel10Proyecto: plataformas 3D
El recorridoPlataformas móviles2Botones y pantallas
Botones y onClickLambdasConectar en el InspectorPaneles activados y desactivadosBarras de saludRepaso: tienda de mejoras5Guardar con PlayerPrefs
Guardar un númeroCargar con un valor predeterminadoPuntuación más altaGuardar ajustesRepaso: monedas en el banco3El gestor del juego
Un solo script ejecuta el juegoEl SingletonEstados del juegoActivar el estadoRepaso: gestor de rondas6Proyecto: corredor infinito
Tres carrilesObstáculos por delante9El nuevo sistema de entrada
Dos sistemas de entradaTeclado y ratónPulsado en este fotogramaAcciones de entradaRepaso: cambio de entrada