Time.deltaTime을 통한 동일한 이동 유니티

2019. 10. 23. 08:30기타/유니티

더보기

"유니티 속도가 디바이스마다 달라요"

"유니티 속도 동일하게 맞추는 법"

"유니티 1초에 n만큼 움직이기"

 

만약, 움직이는 오브젝트의 속도가 PC, 디바이스의 사양의 따라 빨라지거나 느려지면 어떨까요?

모두에게 동일하지 않은 게임이 됩니다. Time.deltaTime은 그런 이슈를 해결해줄 수 있습니다.

 


 

코드를 통해 나쁜 예시를 들어보겠습니다.

 

나쁜 코드.cs

1
2
3
4
5
public float _speed = 10;
 
private void Update() {
    transform.Translate(Vector2.up * _speed);
}
cs

좋은 컴퓨터는 1초에 60의 프레임으로 작동하고,

나쁜 컴퓨터는 1초에 20의 프레임으로 작동한다고 생각해봅시다.

오브젝트의 speed가 10 이니까

결과는,

좋은 컴퓨터는 10 * 60 = 600unit 만큼 움직였을 것이고

나쁜 컴퓨터는 10 * 20 = 200unit 만큼 움직일 것입니다.

3배로 매우 차이가 크게 나죠?

 


 

Time.deltaTime은 프레임과 프레임 사이의 시간을 알려줍니다.

이를 통해서 코드를 바꿔봅시다.

 

개선 코드.cs

1
2
3
4
5
public float _speed = 10;
 
private void Update() {
   transform.Translate(Vector2.up * _speed * Time.deltaTime);
}
cs

좋은 컴퓨터에서는 Time.deltaTime이 1/60초일 것이고

나쁜 컴퓨터에서는 Time.deltaTime이 1/20초일 것입니다.

(Time.deltaTime은 사실 균일하지 않지만 예시를 위해 균일하다고 가정함)

이를 통해 계산해보면

10 * (1/60) * 60 = 10

10 * (1/20) * 20 = 10

좋은 컴퓨터 나쁜 컴퓨터 모두

1초에 10unit을 움직이게 됩니다.

 

즉 1초의 speed 만큼 움직이게 되는 것이지요.

 


 

궁금증이 해결되셨나요?

댓글에 피드백은 환영입니당

 

참고 : https://docs.unity3d.com/kr/530/ScriptReference/Time-deltaTime.html

 

Unity - 스크립팅 API: Time.deltaTime

사용자의 프레임 률(frame rate)을 독립적으로 적용하기 위해서 사용합니다. 매 프레임마다 어떤 값을 더하거나 빼는 계산을 하는 경우에, Time.deltaTime과 곱해서 사용할 수 있습니다. Time.deltaTime과 곱하는 경우에, 다음의 경우를 나타냅니다: 오브젝트를 프레임당 10미터가 아닌 초당 10미터 움직이고 싶은경우를 나타냅니다. MonoBehaviour의 FixedUpdate에서 호출되는 경우에, 고정 프레임률 delta Time을

docs.unity3d.com