docs.unity3d.com/ScriptReference/Time-time.html
2020.3버전 Time.time API입니다.
docs.unity3d.com/ScriptReference/Time-deltaTime.html
2020.3버전 Time.deltaTime API입니다.
게임을 만들면서 time.time과 time.deltaTime을 다르게 적용했을 때 차이점이 생겨서 정확하게 어떠한 점이 다른지에 관해 알고 있으면 다양한 방식으로 활용을 할 수 있을 것 같아서 한번 정리하기로 했습니다.
일단 Time.time부터 설명을 드리겠습니다.
Time.time은 어플리케이션이 실행 된 시간(초)이며 읽기 전용입니다.
응용 프로그램은 각 프레임의 시작 부분에 현재 Time.time을 수신하며 값은 프레임 당 증가합니다.
중요한 점은 Time.time은 프레임 당 시간이 아니라 애플리케이션이 실행된 시간을 제공하기 위한 것입니다.
public class Example : MonoBehaviour
{
public GameObject projectile;
public float fireRate = 0.5f;
private float nextFire = 0.0f;
void Update()
{
if (Input.GetButton("Fire1") && Time.time > nextFire)
{
nextFire = Time.time + fireRate;
Instantiate(projectile, transform.position, transform.rotation);
}
}
}
위 코드를 해석을 해본다면 Fire버튼을 누르고 Time.time(어플리케이션이 수행된 시간) > nextFire가 성립이 된다면
nextFire의 시간이 수정이 되고 projectile이 복사가 되어서 생기게 됩니다.
그렇다면 Time.deltaTime의 경우는 어떨까요?
Time.delatTime 속성은 현재 프레임과 이전 프레임 사이의 시간을 제공합니다.
이 값은 float형태로 반환합니다. 그리고 단위는 동일하게 초를 사용합니다.
저는 Time.deltaTime의 사용하지 않은 예시를 들어보자면
A의 컴퓨터는 빨라서 Update가 더 빨리 실행이 되고 B의 컴퓨터는 느려서 Update함수 호출이 더 적다고 가정을 해봅시다. 그리고 Update에 캐릭터 이동거리를 정의를 해놓았습니다. 이렇게 된다면 당연히 Update가 더 많이 호출 되는 곳이 이동거리가 더 많을 수 밖에 없습니다.
public class ExampleClass : MonoBehaviour {
void Update() {
float translation = Time.deltaTime * 10;
transform.Translate(0, 0, translation);
}
}
예시로 코드를 적어보면 이와 같게 되겠습니다. Time.deltaTime을 사용해서 1프레임 당 이동거리를 계산하여 실행을 합니다. 위와 같이 작성을 한다면 Update가 몇번이 수행이 되어도 같은 결과를 낼 수 있습니다.
추가적으로 설명을 하자면 30프레임과 60프레임 컴퓨터가 있다고 가정을 하겠습니다.
Time.deltaTime*10을 Update에 정의를 했습니다. 30프레임에는 Time.deltaTime에 1/30의 값이 전해지고 60프레임에는 1/60이 전달이 됩니다. 그렇기에 1초가 지났을 때 결국 Time.deltaTime에 전해진 값들을 모두 다 더하면 1이 됩니다.
그렇기에 컴퓨터가 다르다고 하더라도 이동거리는 동일하게 됩니다.
이해가 잘 안되시는 분들을 위해서 다시 한번만 더 성명을 하자면 Time.deltaTime이 현재 프레임과 이전 프레임 사이의 시간을 float형태로 준다고 하였습니다. 극단적으로 전 프레임과 현 프레임의 시간차가 1.0f초라면 float값은 1.0f가 전달이 되는 것입니다.
결과적으로 Time.time과 Time.deltaTime의 차이점은
Time.time은 어플리케이션이 실행된 후 지난 시간
Time.deltaTime은 이전 프레임과 현 프레임 간의 시간을 의미합니다.
'Unity 게임 개발' 카테고리의 다른 글
C# Unity [SerializeField]와 [HideInInspector] (1) | 2021.04.19 |
---|---|
C# 추상메소드와 인터페이스 설명 (0) | 2021.04.14 |
Unity Mathf.Lerp 공부 (0) | 2021.03.29 |
Unity Time.realtimeSinceStartup 설명 및 공부 (0) | 2021.03.28 |
Unity Object.Instantiate() 설명 (0) | 2021.03.21 |