Форматирование чисел
Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 3 из 56.
Число, соединённое со строкой, отображается так, как это делает C#: таймер показывает 12.34567, а число с плавающей точкой, равное 2, отображается как 2, без десятичных знаков. Форматная строка в ToString() задаёт другой способ отображения. Каждый символ 0 в ней обозначает цифру, которая всегда выводится: 7.ToString("000") — это 007, а 41.27f.ToString("0.0") — 41.3, округлённое до одного десятичного знака. В интерполяции строк тот же формат указывается после двоеточия: $"{coins:000}", $"{topSpeed:0.0} m/s".
Время удобнее читать в минутах и секундах. Сначала приведи время к типу int, отбросив дробную часть; затем целочисленное деление на 60 даст целое количество минут, а % 60 — оставшиеся секунды. Круг, пройденный за 83.46 секунды:
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}"; // Lap: 1:2300 оставляет две цифры: без него круг за 64 секунды отображался бы как 1:4, а не 1:04. А поскольку (int) отбрасывает дробную часть, а не округляет, 59.7 секунды отображаются как 0:59; при округлении на мгновение отобразилось бы 0:60.
Задание
ЛегкоТабло аркады Scoreboard.cs показывает числа без форматирования. Пробел добавляет 100 очков, умноженных на комбо, и увеличивает комбо на 0.5, а playTime отсчитывает прошедшие секунды (в Inspector начальное значение — 47.5). Не меняй подсчёт, а измени форматирование трёх текстовых полей:
scoreText: счёт в виде шестизначного числа, напримерScore: 000450.comboText: комбо с одним десятичным знаком, напримерCombo: x2.5, а в начале —Combo: x1.0.timeText: минуты и целые секунды, напримерTime: 2:07. Секунды всегда отображаются двумя цифрами и никогда не округляются вверх.
Нажми Play, набери очки несколько раз, затем нажми Check.
Попробуйте сами
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;
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня7Управление временем
Пауза с timeScaleЗамедленное движениеНемасштабируемое времяПовторение: Bullet Time10Проект: 3D-платформер
ТрассаДвижущиеся платформы2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банке