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は切り上げます。これはカウントダウンの表示に適しています。最初の1秒間はずっと5(4.99も切り上げられて5になります)、最後の1秒間は1と表示され、時間切れになったときだけ0になります。(int)fuseでは4.99が4に切り捨てられ、爆弾の導火線がまだ燃えている最後の1秒間ずっと0と表示されます。Mathf.RoundToIntでは、最後の0.5秒間0と表示されます。分と秒で表示する長いカウントダウンにも、同じルールが当てはまります。まず時間を秒単位で切り上げてから、その値を整形します。

最初のreturnによって、画面上のBOOM表示が維持されます。これがないと、次のフレームでその表示がFuse: 0に上書きされます。テキストには色もあり、fuseText.color = Color.redで赤くなります。

challenge icon

チャレンジ

簡単

パーキングメーターで、支払われた時間をカウントダウンさせましょう。

  1. Update()で、Time.deltaTimeをtimeLeftから引き、0未満にならないようにして、Mathf.CeilToInt(timeLeft)を分と秒で表示します:1:15。
  2. スペースキーを押すと30秒追加され、maxTime(2:00)まで増えます。
  3. 0になったら、Color.redでEXPIREDを表示します。時間切れの状態を維持するため、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プレイグラウンド