유니티에서 스킬의 쿨다운 타이머를 구현할 때, Time.deltaTime을 사용해 시간을 계산했다. 하지만 테스트 도중, 타이머가 실제 시간보다 빠르게 흐르는 현상을 발견했다. 예를 들어, 15초의 쿨다운 시간이 실제로는 14초 미만으로 줄어드는 것을 확인할 수 있었다.
이 문제의 원인은 Time.deltaTime이 프레임 간의 시간을 나타내기 때문에, 프레임 속도가 매우 높은 경우(FPS가 높을 때) 각 프레임에서 더 작은 시간 간격이 누적되며 시간이 더 빨리 흘러가게 된다. 이로 인해 쿨다운 타이머가 예상보다 빠르게 끝나는 현상이 발생한 것이다.
쿨다운 타이머의 정확성을 보장하기 위해 Time.time을 사용하여 타이머를 재구현하기로 했다.
Time.time: 유니티에서 게임이 시작된 후 경과한 시간을 나타내는 값으로, 실시간으로 갱신되며 프레임 속도와는 무관하게 정확한 시간을 제공한다.
이를 통해 정확한 타이머를 구현할 수 있었고, 쿨다운 타이머가 예상한 대로 정확하게 작동하도록 할 수 있었다.
구현한 코드
protected IEnumerator SkillEffect()
{
onCooldown = true;
float startTime = Time.time; // 시작 시간 기록
float endTime = startTime + cooldownTime; // 종료 시간 계산
cooldownRemaining = cooldownTime;
skillTimeRemaining = skillDuration;
if (cooldownImage != null)
{
cooldownImage.gameObject.SetActive(true);
}
// 스킬 정보 오브젝트 활성화
if (skillInfoObject != null)
{
skillInfoObject.SetActive(true);
}
// 스킬 지속 시간 동안 대기
float elapsedSkillTime = 0f;
while (elapsedSkillTime < skillDuration)
{
elapsedSkillTime += Time.deltaTime;
yield return null;
}
// 스킬 지속 시간이 끝났을 때 스킬 정보 오브젝트 비활성화
if (skillInfoObject != null)
{
skillInfoObject.SetActive(false);
}
// 쿨다운 시간 동안 대기
while (Time.time < endTime)
{
cooldownRemaining = endTime - Time.time;
UpdateCooldownUI(cooldownRemaining);
yield return null;
}
onCooldown = false;
cooldownImage.gameObject.SetActive(false);
UpdateCooldownUI(0);
}
이 코드를 적용한 후, 쿨다운 타이머가 정확하게 작동하게 되었다. Time.time을 사용함으로써 프레임 속도와 무관하게 일관된 타이머를 구현할 수 있었다.
Time.deltaTime은 프레임 간의 시간 변화에 사용해야 하며, 정확한 시간 계산이 필요할 때는 Time.time을 사용해야 한다.
프레임 속도에 민감한 타이머 구현 시에는 Time.time이 더 적합하다.
이번 작업을 통해 시간 계산 시 Time.deltaTime과 Time.time의 차이를 명확히 이해할 수 있었다. 앞으로도 이러한 시간 관련 기능을 구현할 때 어떤 방식이 더 적합한지 고민하고 적용하는 것이 중요하다는 것을 깨달았다.