본문 바로가기

Unity3D/C#

시스템 시간을 이용한 프레임 영향이 없는 타이머(Timer) 스크립트

반응형

System.DateTime

 

 

타이머를 만들다 보면, 프로그램이 일시 정지가 됐을 때 의도적으로 타이머도 정지하는 경우가 있는가 하면, 프로그램이

멈추거나 프레임이 느려지더라도 영향을 받지 않고 실제 시간을 반영하고 싶을 때가 있습니다. 이런 경우 단순히 time.deltaTime을 이용하거나 유니티 플레이 타임인 time.Time을 이용하는 것으로 구현하는 것은 거의 불가능합니다. 프로그램이 멈추더라도 항상 시간은 계산되고 있는 하드웨어의 시스템적인 요소를 이용해야 합니다. 유니티는 System이라는 namespace에 접근하고 DateTime이라는 struct에 접근해서 시간 관련 함수나 변수에 접근할 수 있습니다. 우리는 이러한 고유의 System 시간을 이용해서 구현을 할 것입니다. 현재 날짜와 시간을 Second로 표시하는 변수를 사용할 것입니다. 변수는 [System.DateTime.Now.TimeOfDay.TotalSeconds]으로 입력하면 됩니다. 전체 Second를 double 단위로 소수점 아래까지 반환합니다. 시스템 시간 기반으로 하면 가장 큰 장점은, 사용하고 있는 하드웨어가 문제가 있지 않은 한, 시간의 오차가 없고 정확합니다. 만약 성능 문제로 프로그램이 느려진다 하더라도, 반복문에서 다시 시스템 시간을 가져오면 오차 없이 정상적으로 시간이 표시될 것입니다.

 

 

C# (UNITY 3D)

 

 

 

 

일시 정지 후 플레이 예시

타이머가 프레임에 영향을 받는지 유니티 에디터에서도 간단하게 테스트할 수 있습니다. 프로그램이 일시정지되는 상황을 강제로 연출하기 위해서, 유니티 에디터의 일시정지 버튼을 눌렀다가 잠시 후 다시 플레이합니다.

 

 

 

  
    public UnityEngine.UI.Text text_Timer;
    private float time_start;
    private float time_current;
    private float time_Max = 5f;
    private bool isEnded;

    private void Start()
    {
        Reset_Timer();
    }
    void Update()
    {
         
        if (isEnded)
            return;

        Check_Timer();
    }

    //CodeFinder
    //From https://codefinder.janndk.com/
    private void Check_Timer()
    {
        time_current = (float)System.DateTime.Now.TimeOfDay.TotalSeconds - time_start; 
        if (time_current < time_Max)
        {
            text_Timer.text = $"{time_current:N4}";
            Debug.Log(time_current);
        }
        else if (!isEnded)
        {
            End_Timer();
        } 
    }

    private void End_Timer()
    {
        Debug.Log("End");
        time_current = time_Max;
        text_Timer.text = $"{time_current:N4}";
        isEnded = true;
    }


    private void Reset_Timer()
    {
        time_start = (float)System.DateTime.Now.TimeOfDay.TotalSeconds;
        time_current = 0;
        text_Timer.text = $"{time_current:N4}";
        isEnded = false;
        Debug.Log("Start");
    }
    

 

변수(variable)
text_Timer : 현재 시간을 표시하는 Text

time_start : 타이머 시작 시 시스템 시간
time_current : 현재 시간 ((float)System.DateTime.Now.TimeOfDay.TotalSeconds - time_start)
time_Max : 최종 시간
isEnded : 종료 확인

함수(function)
Check_Timer : 시간 검사 (반복문)
End_Timer : 종료 시 실행
Reset_Timer : 리셋

 

 

Unity C# / UnityTimer / 유니티 시스템 시간 / System.DateTime / Simple Countdown / Simple Stopwatch / 시간측정 / Frame / 타이머만들기 / 유니티시계 / Simple Countdown / Simple Stopwatch / Simple Countdown / 카운터 / 스톱워치 / 제한시간 / 딜레이 / Update / ResetTime / CheckTime / FinishTime / Full Script

반응형