TIL

2024/01/12 TIL

미역제자 2024. 1. 13. 00:17


Time.timeScale

시간이 흐르는 척도이다. 이는 슬로우 모션 효과에 사용되거나 애플리케이션 속도를 높이는 데 사용할 수 있다. timeScale이 1.0이면 시간은 실제 시간만큼 빠르게 흐른다. timeScale이 0.5이면 시간은 실시간보다 2배 느리게 흐르게 된다.

timeScale이 0으로 설정되면 모든 기능이 프레임 속도에 독립적인 경우 애플리케이션이 일시 중지된 것처럼 작동한다. 이 기능을 이용해서 시간을 다루는 게임을 만들어 보고자 한다.

 

위에서 말했듯, timeScale을 멈추었을 경우 시간이 멈춘 것 같은 효과를 줄 수 있다. 하지만 게임에서 플레이어는 움직이도록 만들 것이기 때문에 시간에 영향을 받지 않으면서 움직이도록 만들어야 한다. 이때 필요한 것이 .unscaledDeltaTime이다.


Time.unscaledDeltaTime

기존의 .deltaTime과는 다르게 이 프로퍼티는 TimeScale에 영향을 받지 않는다. 컴퓨터마다 프레임이 다르기 때문에 프레임에 상관없이 일정한 값을 호출하기 위해 우리는 deltaTime을 사용한다. 하지만 우리가 만들것은 시간의 흐름에 영향을 받지 않도록 하는 코드이기 때문에 unscaledDeltaTime을 사용할 것이다. 

 

하지만 플레이어의 움직임에 unscaledDeltaTime을 사용해도 기존에 하던 것 처럼 FixedUpdate에서 호출하게 되면 의미가 없다. FixedUpdate는 TimeScale의 영향을 받기 때문이다. 따라서 TimeScale의 영향을 받지 않는 Update에서 호출한다. 

public class PlayerEventController : MonoBehaviour
{
	...(중략)
	private void Update()
    {
        Move();
        if (canLook)
        {
            CameraLook();
        }
        curJumpDelay -= Time.unscaledDeltaTime;
    }
    private void Move()
    {
        Vector3 dir = transform.forward * curMovementInput.y + transform.right * curMovementInput.x;
        _rigidbody.transform.position += dir * multifle * Time.unscaledDeltaTime;
    }
    void CameraLook()
    {
        camCurXRot += mouseDelta.y * lookSensitivity * multifle * Time.unscaledDeltaTime;
        camCurXRot = Mathf.Clamp(camCurXRot, minXLook, maxXLook);
        cameraContainer.localEulerAngles = new Vector3(-camCurXRot, 0, 0);

        transform.eulerAngles += new Vector3(0, mouseDelta.x * lookSensitivity * multifle * Time.unscaledDeltaTime, 0);
    }
    ...(후략)
    
}