본문 바로가기
게임 개발 일지/내일배움캠프 TIL

[C#] Update 주의사항 / Time.deltaTime 사용법

by 빛하_ 2024. 2. 20.

MonoBehaviour 의 주요 클래스인 Update 사용 시 주의사항은?

 

1. 주기적인 호출 

Update 메서드는 매 프레임마다 호출된다. 따라서 무거운 계산이나 자원 소모적인 작업을 수행하면 성능에 부정적인 영향을 미칠 수 있다. 필요한 경우에만 호출될 수 있도록 최적화가 필수적이다.

 

* Update 사용을 줄이는 방법 

FixedUpdate는 고정된 시간 간격으로 호출되며, 물리 시뮬레이션에 사용된다. 물리 연산과 관련된 작업은 FixedUpdate에서 수행하는 것이 좋다.

 

2. 프레임 시간에 따른 차이점

Update 의 가장 큰 특징은 호출 시간 간격이 프레임에 따라 변한다는 것이다. 프레임마다 호출되는 특성 상 서로 다른 컴퓨터에서 출력에 차이를 보일 수 있다. 특히 인게임에서 시간과 관련된 부분을 다루는 경우 유저 간 경험의 차이가 발생할 수있다. 따라서 시간에 영향을 주는 작업 수행 시 Time.deltaTime을 사용하여 프레임 간 경과 시간을 고려해야 한다. 이를 통해 게임이 어떤 환경, 성능, 속도로 실행되어도 항상 일관된 결과를 보장할 수 있게 된다.

 

3. 자원 해제 

게임 오브젝트나 컴포넌트를 사용한 후에는 적절한 시점에 메모리 누수를 방지하기 위해 해당 자원을 해제해야 한다. OnDestroy 메서드를 활용하여 자원을 정리할 수 있다.

 

4. Null 체크

외부 리소스나 다른 오브젝트와의 상호 작용 시 null 체크를 항상 수행해야 한다. 예상치 못한 null 참조로 인한 오류를 방지할 수 있다.

 

 

Time.deltaTime이란 무엇인가?

Time.DeltaTime 이란 Unity 게임 엔진에서 프레임 간 경과 시간을 나타내는 변수이다.

컴퓨터 성능이 느릴수록 그 값이 커진다. 

C#에서 Update 함수는 매 프레임마다 호출해 코드를 실행한다.
컴퓨터 성능에 따라 한 프레임에 나오는 결과 값이 다를 수 있는데, Time.DeltaTime을 사용함으로써 서로 다른 유저가 같은 결과값을 낼 수 있도록 보정할 수 있다. 유저의 컴퓨터 fps 환경에 따라 달라지는 시간 간격을 자동으로 계산해줌으로써 서로 다른 컴퓨터 환경으로 인해 발생하는 차이를 방지한다.

 

Time.deltaTime은 주로 게임에서 시간과 관련된 작업을 수행할 때 사용한다.

Unity는 프레임마다 게임 루프를 실행하며, Time.deltaTime은 이 프레임 간의 경과 시간을 나타낸다. 이 값은 부동 소수점 숫자로 표현되며, 초 단위로 경과 시간을 나타낸다.

예를 들어, 게임에서 물체를 이동시키거나 애니메이션을 제어할 때, Time.deltaTime을 사용하여 각 프레임에서 이동이나 애니메이션을 조절함으로써 게임이 서로 다른 프레임 속도에서 실행될 때도 일관된 동작을 유지할 수 있다.

이는 빠르거나 느린 시스템에서도 공평한 게임 환경을 조성함으로써 여러 유저에게 일관된 경험을 제공하는 데 도움을 준다.

 

 

Time.deltaTime을 이용해 간단한 타이머 만들기

{
    int curTime;
    IEnumerator Timer()
    {
        yield return new WaitForSeconds(1.0f); // 화면 전환을 위해 잠깐 기다림
        curTime = 60;
        while (curTime > 0)
        {
            curTime -= Time.deltaTime;
            minute = (int)curTime / 60;
            second = (int)curTime % 60;
            text.text = second.ToString("0");
            yield return null;

            if (curTime <= 0)
            {
                yield break;
            }
        }
    }
}

 

curTime이라는 int형 변수에 시간을 담고,

매초마다 Time.deltaTime을 이용해 보장된 1초를 감소시킴으로써 타이머를 만들 수 있다.

 

 

댓글