속도와 시간 간격
Update( ) 메서드는 평균적으로 1초에 60번 실행됩니다. 하지만 이것은 평균일 뿐 게임 화면을 갱신하는 주기는 컴퓨터 성능에 의존적이라서 Update( )가 1초에 몇 번 실행될지는 알 수 없습니다. 하지만 이것은 평균일 뿐 게임 화면을 갱신하는 주기는 컴퓨터 성능에 의존적이기 때문에 Update가 1초에 몇 번 실행될지는 알 수 없습니다. 따라서 Update( ) 메서드에서 초당 이동 속도나 회전 속도 등 시간과 관련된 수치를 다룰 때는 시간 간격을 고려해야 합니다. 그렇지 않으면 컴퓨터 성능에 따라 같은 코드가 다르게 동작할 수 있습니다. 이 문제와 관련된 흔한 현상으로 Pc게이머들이 '프레임 제한'을 해제했을 때 발생하는 문제가 있습니다.
고정 프레임이 60인 게임이 있다고 가정 할 때, 개발자는 초당 프레임이 60으로 고정되어 있으므로 어떤 게임 오브젝트가 1초 동안 1미터를 이동하거나, 1초 동안 60도 회전을 한다면 Update( ) 메서드에서 한 번에 1/60미터를 이동하고 1도 회전하도록 작성 해야 합니다.
※ 초당 프레임이 서로 다른 컴퓨터
컴퓨터 | A 컴퓨터 (1초에 60번 게임 화면 갱신) | B 컴퓨터 (1초에 120번 게임 화면 갱신) |
고정 프레임 | 1/60미터 x 60번 = 1미터 | 1/60 x 120번 = 2미터 |
1도 회전 x 60번 = 60도 회전 | 1도 회전x120번 = 120도 회전 |
이렇게 컴퓨터의 성능에 따라 결과가 다르게 나옵니다. 이것을 해결하는 방법은 '시간 간격으로 쪼개서 누적하는 것'입니다. 시간 간격을 쪼개서 누적하는 것은 초당 프레임의 역수를 값에 곱하는것입니다. 1초에 코드가 실행되는 횟수를 역수하면 직전 프레임과 현재 프레임 사이의 시간 간격이 됩니다.
※ 시간 간격으로 쪼개서 누적하는 방법을 적용
A 컴퓨터 (1초에 60번 게임 화면 갱신) | B 컴퓨터 (1초에 120번 게임 화면 갱신) |
1미터 x (1 / 60) x 60번 = 1미터 | 1 x (1 / 120) x 120번 = 2미터 |
60도 회전 x (1 / 60) x 60번 = 60도 회전 | 60도 회전 x (1 / 120) x 120번 = 60도 회전 |
이 방법은 Update( ) 메서드가 1초에 몇 번 실행되든 상관없이 적용할 수 있습니다. 결론은 초당 프레임의 역수를 취한 값(프레임의 주기)을 곱하면 '한 번에 x만큼 이동'에서 '1초 동안 x만큼 이동'을 구현할 수 있습니다.
유니티에서 Time.deltaTime이 이전 프레임과 현재 프레임(이전 Update와 현재 Update 실행 시점) 사이의 간격을 제공합니다. Time.deltaTime값은 프레임의 주기이자 초당 프레임에 역수를 취한 값입니다. Time.deltaTime을 사용하여 지금까지 설명한 해경 방법을 구현할 수 있습니다.
※ 출처: 레트로의 유니티 게임 프로그래밍 에센스: C#으로 배우는 입문부터 4가지 게임 제작까지.
공부 목적으로만 사용하였습니다.
'🎯 game engine > ◽ 유니티(unity)' 카테고리의 다른 글
(unity) 생명주기,unity Lifecycle, 이벤트 함수의 실행 순서, 코루틴 (0) | 2022.09.15 |
---|---|
(unity) GetComponent, GetAxis, OnTriggerEnter, OnCollisionEnter, FindObjectOfType (0) | 2022.07.12 |
(unity) MonoBehaviour? 메세지 기반 방식? 유니티 이벤트 메서드? (0) | 2022.07.11 |
(unity/warning CS0108, NullReferenceException) (0) | 2022.04.18 |
(Unity/ error: CS8357) deterministic compilation failed (0) | 2022.04.16 |
안 하는 것 보다 낫겠지
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!