格式化数字
本课属于 Coddy Unity 学习旅程的“打造真正的游戏”单元。第 3 课,共 60 课。
数字与字符串拼接时,会按 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。
挑战
简单设置街机中的三个数字的格式。
- 在
Update()中,先添加int seconds = (int)playTime;。 - 用
{score:000000}将分数显示为六位数,例如Score: 000450;用{combo:0.0}将连击数显示为一位小数,例如Combo: x2.5。 - 将时间显示为
Time: 2:07:使用seconds / 60,接着加上冒号,然后将seconds % 60显示为两位数。
按“开始”,再按 Space:分数会始终显示为六位数。然后点击“检查”。
亲手试试
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;
}
}
打造真正的游戏中的所有课
自己练习: Unity 在线编辑器