カウントダウンタイマー
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で赤くなります。
チャレンジ
簡単パーキングメーターで、支払われた時間をカウントダウンさせましょう。
Update()で、Time.deltaTimeをtimeLeftから引き、0未満にならないようにして、Mathf.CeilToInt(timeLeft)を分と秒で表示します:1:15。- スペースキーを押すと30秒追加され、
maxTime(2:00)まで増えます。 - 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プレイグラウンド