カウントダウンタイマー
CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 4/56。
カウントダウンでは残り時間を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で赤色に変わります。
チャレンジ
簡単パーキングメーターは、支払われた時間をカウントダウンします。Update()をParkingMeter.csに記述してください(シーンではmeterTextがリンクされています)。
timeLeftは75秒から始まり(Inspectorで設定)、フレームごとに減っていき、0未満にはなりません。meterTextには残り時間を分と秒で表示し、秒単位で切り上げます。75秒から74.01秒までは1:15と表示され、残り0.4秒では0:01と表示されます。- スペースキーを押すとコインが投入され、30秒追加されます。ただし、
maxTime(120秒。2:00と表示されます)を超えることはありません。 - 0になると、テキストは赤色で
EXPIREDと表示されます(Color.red)。その後、メーターは0のままとなり、コインを投入できなくなります。
Playを押し、コインを何枚か投入してから、Checkを押してください。
自分で試してみよう
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秒加算する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。