본문 바로가기
Unity 3D/Unity3D

[Unity 3D] Time.deltaTime 과 Update

by dbxxrud 2019. 5. 12.

 

 

Time.deltaTime - 이전 프레임에서 현재 프레임까지 걸린 시간

 

 

  

Update()

 

Time.deltaTime에 대해서 자세히 설명하기 전에 먼저 Update문을 설명하자면 Update()는 유니티에서 가장 빈번히 사용되는 함수이며, 스크립트가 활성화돼 있을 때 매 프레임마다 함수로써 물리 효과가 적용되지 않은 오브젝트의 움직임이나 단순한 타이머, 키 입력 등등 모니터링 기능이 필요할 때 유용하다. 하지만 Update 가 모든 컴포넌트에 매 프레임마다 불려지는 것이 보장되지는 않는다.

 

 

<시간에 따라 움직임을 구현할때 다룰 두 가지 규칙>

 

  • 프레임은 소중하다

- 매 초마다 많은 횟수의 프레임이 반복된다. 그러지 못하면 게임이 버벅 거리거나 오류가 생긴 것처럼 보일 수 있다. 매 프레임마다 씬 안에 모든 활성화된 MonoBehaviour 컴포넌트에 Update가 호출된다. Update 안에서 하는 일들이 매 프레임 해당 신을 처리하는 계산 복잡도에 큰 영향을 미친다. 기능이 많을수록 CPU와 GPU 모두에 더 많은 처리시간과 더 큰 부하를 일으킨다. 그래서 Update나 프레임 기반으로 규칙적으로 호출되는 이벤트를 아껴 쓰는 것이 중요하다.

 

 

  • 움직임은 시간과 비례해야 한다

- 프레임의 주기를 일정하게 보장할 수 없기 떄문에 (컴퓨터마다 다름), 유저에게 일관된 경험을 제공하기 위해 주의를 기울여 코딩을 해야 한다. 

 

아래 예제는 오브젝트를 간단하게 움직이는 예제이다. 하지만 문제는 이 코드가 프레임 레이트에 의존적이라는 것이다. 시간과 컴퓨터에 따라 프레임이 일정하지 않기 때문에 유저들은 각각 다른 속도로 움직이는 cube를 보게 된다. 그래서 움직임을 프레임이 아닌 시간에 비례하도록 해야 한다. 프레임은 가변적이지만 시간은 일정하기 때문이다. Time 클래스의 멤버인 deltaTime 변수를 이용하면 그러한 구현이 가능하다.

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Sample : MonoBehaviour
{
    public float AmountToMove = 0.5f;
 
    void Update()
    {
        transform.localPosition += new Vector3(AmountToMove, 00);
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5; text-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none; color:white">cs

 

 

 

Time.deltaTime을 이용하여 2초후에(대기) 큐브가 회전하고 3초 후에 멈추는(시간 지연) 기능을 만들 수 있다.

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Sample : MonoBehaviour
{
    public float rotSpeed = 360f;
    public float time = 0;
    public float rotStartTime = 2.0f;
    public float rotDuration = 3.0f;
 
    void Update()
    {
        time += Time.deltaTime;
 
        if (time > rotStartTime && time < rotStartTime + rotDuration)
            transform.Rotate(0, rotSpeed * Time.deltaTime, 0);
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5; text-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none; color:white">cs

 

 

 

 

- 공부하면서 정리하는 블로그 입니다.