Menu
CoddyTech

倒计时器

本课属于 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 会将它变成红色。

challenge icon

挑战

简单

让停车计时器倒计时已付费的时间。

  1. 在 Update() 中,从 timeLeft 减去 Time.deltaTime,但不能低于 0,并将 Mathf.CeilToInt(timeLeft) 显示为分和秒:1:15。
  2. 按空格键可增加 30 秒,最多达到 maxTime(2:00)。
  3. 时间到 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 在线编辑器