倒计时器
本课属于 Coddy Unity 学习旅程的“打造真正的游戏”单元。第 4 课,共 60 课。
倒计时会用 float 保存剩余时间,并在每一帧中减去 Time.deltaTime。最后一帧很少会恰好停在 0,因此 Mathf.Max 会将时间限制在 0,并且结束操作必须只执行一次。这个引信给玩家 5 秒时间拆除炸弹:
public TMP_Text fuseText;
public float fuse = 5f;
private bool exploded;
void Update()
{
if (exploded)
{
return;
}
fuse = Mathf.Max(fuse - Time.deltaTime, 0f);
fuseText.text = "Fuse: " + Mathf.CeilToInt(fuse);
if (fuse == 0f)
{
exploded = true;
fuseText.text = "BOOM";
fuseText.color = Color.red;
}
}Mathf.CeilToInt 会向上取整,这正是倒计时的显示方式:第一个完整秒内显示 5(4.99 向上取整为 5),最后一秒内显示 1,只有时间结束时才显示 0。(int)fuse 会把 4.99 向下截取为 4,并在炸弹仍在滴答计时的整个最后一秒里显示 0;Mathf.RoundToInt 则会在最后半秒显示 0。更长的倒计时如果以分钟和秒显示,也遵循相同的规则:先将时间向上取整到整秒,再格式化这些秒数。
前面的 return 会让屏幕上的 BOOM 保持显示:如果没有它,下一帧就会用 Fuse: 0 覆盖它。文本也有颜色,fuseText.color = Color.red 会将它变成红色。
挑战
简单让停车计时器倒计时已付费的时间。
- 在
Update()中,从timeLeft减去Time.deltaTime,但不能低于 0,并将Mathf.CeilToInt(timeLeft)显示为分和秒:1:15。 - 按空格键可增加 30 秒,最多达到
maxTime(2:00)。 - 时间到 0 时,显示
EXPIRED,并使用Color.red。在Update()开头写上if (timeLeft == 0f) return;,这样显示就会保持不变。
按运行并投入硬币:计时会停在 2:00。然后点击检查。
亲手试试
using UnityEngine;
using TMPro;
public class ParkingMeter : MonoBehaviour
{
public TMP_Text meterText;
public float timeLeft = 60f;
public float maxTime = 120f;
void Update()
{
// 让 timeLeft 倒计时,并以分和秒显示;按 Space 键增加 30 秒。
}
}
打造真正的游戏中的所有课
自己练习: Unity 在线编辑器