카운트다운 타이머
Coddy Unity 여정의 실제 게임 만들기 섹션에 포함된 레슨. 56개 중 4번째.
카운트다운은 남은 시간을 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를 사용하면 빨간색으로 바뀌어요.
챌린지
쉬움주차 미터기는 결제된 시간을 카운트다운합니다. ParkingMeter.cs에서 Update()를 작성하세요(장면에서 meterText를 연결합니다):
timeLeft는 75초부터 시작하며(Inspector에서 설정) 매 프레임 감소하고, 절대 0보다 작아지지 않습니다.meterText에는 남은 시간이 분과 초로 표시되며, 초 단위로 올림합니다. 75초부터 74.01초까지는1:15가 표시되고, 0.4초가 남았을 때는0:01이 표시됩니다.- Space 키를 누르면 동전을 넣습니다. 시간이 30초 늘어나지만,
maxTime(120초,2:00으로 표시됨)을 초과하지 않습니다. - 0초가 되면 텍스트가 빨간색(
Color.red)으로EXPIRED라고 표시됩니다. 그때부터 미터기는 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초가 추가됩니다
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.