카운트다운 타이머
Coddy Unity 여정의 실제 게임 만들기 섹션에 포함된 레슨. 60개 중 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를 사용하면 텍스트가 빨간색으로 바뀝니다.
챌린지
쉬움주차 미터기가 결제한 시간을 카운트다운하도록 만드세요.
Update()에서timeLeft에서Time.deltaTime을 빼되 0보다 낮아지지 않게 하고,Mathf.CeilToInt(timeLeft)를 분과 초로 표시하세요:1:15.- 스페이스바를 누르면 최대
maxTime(2:00)까지 30초가 추가됩니다. - 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 플레이그라운드