시간 및 프레임 속도 관리
Update에선 프레임에 따라 호출주기가 결정됩니다. 하지만 게임의 프레임 속도는 일정하지 않으며 Update 함수 콜 사이의 시간 간격 역시 일정하지 않습니다.
예를 들어 Update에서 플레이어를 전진시킨다고 했을 때
using UnityEngine;
using System.Collections;
public class ExampleScript : MonoBehaviour
{
public float distancePerFrame;
void Update() {
transform.Translate(0, 0, distancePerFrame);
}
}
사용자 컴퓨터의 프레임에 따라 호출되는 주기가 달라지므로 결국 초당 이동거리는 변하게 됩니다.
이를 해결하려면 움직임의 크기를 Time.deltaTime에서 읽어올 수 있는 프레임 시간에 맞추어 스케일하면 됩니다.
TimeScale
- Unity에서는 Time Scale 프로퍼티를 통해 게임 시간이 현실 시간에 대비하여 흘러가는 속도를 조절할 수 있습니다. 값이 0이면 시간이 완전히 “멈추게” 됩니다.
- 시간 스케일은 실제로 느리게 실행되도록 만드는 것이 아니라 Time.deltaTime 및 Time.fixedDeltaTime을 통해 Update 및 FixedUpdate 함수에 전해지는 타임 스텝만을 변경한다는 점에 유의해야 합니다.
- 게임 시간이 느려지면 Update 함수는 보통 경우보다 더 자주 호출되게 되지만, 각 프레임마다 전해지는 deltaTime 스텝은 단순히 줄어듭니다. 다른 스크립트 함수는 시간 스케일의 영향을 받지 않으므로 예를 들어, 게임이 일시정지 상태일 때 일반 상호작용을 하는 GUI를 표시할 수 있습니다.
고정 타임스텝(Fixed Timestep)
- Unity의 물리 시스템은 고정 타임스텝으로 작동하며 이 점은 시뮬레이션의 정확도와 일관성에 매우 중요합니다.
- 물리 업데이트를 시작할 때 Unity는 마지막 물리 업데이트가 끝난 시간에 고정 타임스텝 값을 추가함으로써 “알람”을 설정합니다.
- 그러고 나면 물리 시스템은 알람이 꺼질 때까지 계산을 수행합니다.
- 고정 타임스텝의 크기는 타임 관리자에서 변경할 수 있으며 스크립트에서 Time.fixedDeltaTime 프로퍼티를 사용하여 읽을 수 있습니다.
- 타임스텝 값이 낮으면 물리 업데이트가 더 자주 일어나고 시뮬레이션이 정밀해지지만 CPU 로드 비용이 커진다는 점에 유의해야 합니다.
'TIL' 카테고리의 다른 글
2024/02/01 TIL (Rendering_Lighting 문제) (0) | 2024.02.02 |
---|---|
2024/01/31 TIL (움직임 구현에 대한 고찰) (0) | 2024.02.01 |
2024/01/29 TIL (Dictionary) (0) | 2024.01.30 |
2024/01/26 TIL (Light) (1) | 2024.01.27 |
2024/01/25 TIL (CharacterController SkinWidth) (1) | 2024.01.26 |