대부분 게임을 하면서 FPS라는 단어를 들어보았을 겁니다. Frames Per Second의 약자인데 "초당 프레임 수"라는 의미를 가지고 있습니다. 이 글에선 이 FPS가 게임에 영향을 어떻게 미치고, 유니티로 어떻게 극복하는지에 대해 알아보겠습니다.
Time.deltaTime
1. Time.deltaTime이란?
Time.deltaTime은 "한 프레임 당 실행하는 시간"을 뜻하는데, 값을 float형태로 반환합니다. 단위는 초를 사용합니다.
2. Time.deltaTime의 원리
유니티의 Update함수는 매 프레임마다 호출하여 해당 코드를 실행하게 됩니다. 예를 들어 캐릭터의 이동을 Update함수에 구현했다고 가정해봅니다. 그렇다면 성능이 좋은 컴퓨터와 나쁜 컴퓨터에선 어떤 차이가 일어나게 될까요?
다음 이미지와 같이 성능 좋은 컴퓨터는 1초에 100m를 이동할 수 있고, 성능 나쁜 컴퓨터는 1초에 10m를 이동하게 됩니다. 이런 상태로 게임이 출시된다면 아무리 실력이 좋아도 성능 좋은 컴퓨터를 가진 플레이어를 따라잡기 어렵습니다. 이러한 게임 플레이에 치명적인 요소를 해결할 수 있는 것이 바로 Time.deltaTime입니다.
자세히 알아봅시다.
최종 목표는 Update가 실행될 때마다 1프레임 당 이동거리를 계산하여 실행하는 것입니다. 그럼 Update가 1초에 10번 실행되든 100번 실행되든 똑같은 결과를 내놓을 수 있습니다.
[ 속도 = 거리 / 초 ] 를 여기에 적용해보면,
[ 이동속도 = 캐릭터 이동거리 / 초 ] 라고 나타낼 수 있습니다.
이제 양변에 Time.deltaTime (1프레임 당 실행시간)을 곱해주면
[ 이동속도 X 1프레임 당 실행시간 = 1프레임 당 실행시간 X 캐릭터 이동거리 / 초 ] 가 됩니다.
[ 속도 X 시간 = 거리 ] 이므로 [ 이동속도 X 1프레임 당 실행시간 = 1프레임 당 이동거리 ]
[ 거리 / 시간 = 속도 ] 이므로 [ 캐릭터 이동거리 / 초 = 캐릭터 이동속도 ]
정리해보면, [ 1프레임 당 이동거리 = 1프레임 당 실행시간 X 캐릭터 이동속도 ] 가 됩니다.
마지막 식을 말로 풀자면, 성능 나쁜 컴퓨터는 1프레임 당 실행시간이 길어짐에 따라 1프레임 당 이동거리도 자연스레 늘어날 것입니다. 이것으로 성능 좋은 컴퓨터와의 격차를 없앨 수 있습니다.
(참고)
30프레임 게임은 Time.deltaTime = 0.03초
60프레임 게임은 Time.deltaTime = 0.016초
3. 사용
"[Unity 3D] 캐릭터 움직임 구현" 글에서 코드를 가져와보면
1
2
3
4
5
6
7
8
9
10
|
public class CharacterMove : MonoBehaviour
{
public float speed = 5f;
void Update(){
if (Input.GetKey(KeyCode.LeftArrow)){
transform.Translate(-speed * Time.deltaTime, 0, 0);
}
}
}
|
cs |
이와 같이 왼쪽으로 이동을 구현할 수 있겠습니다.
참고 사이트
'게임 > Unity' 카테고리의 다른 글
[Unity 이론] Firebase Database (0) | 2019.11.28 |
---|---|
[Unity 이론] Object Pooling (0) | 2019.11.26 |
[Unity 이론] Coroutine (1) | 2019.11.26 |
[Unity 3D] 충돌 체크 (0) | 2019.11.25 |
[Unity 3D] 캐릭터 움직임 구현 (2) | 2019.11.23 |
댓글