본문 바로가기
Unity/Advanced

유니티 시간(Time)

by 노튜 2025. 2. 19.
728x90
반응형

 

1. Time

유니티 프로젝트를 진행하다 보면 시간과 관련된 기능을 구현하는 경우가 생긴다. 재사용 대기시간(Cooldown), 지속시간(Duration time) 등을 예로 들 수 있다. 유니티는 시간과 관련된 Time 클래스를 제공한다. Time 클래스는 게임이나 앱이 실행되는 동안 시간의 흐름을 측정할 수 있도록 숫자 값을 제공하는 클래스이다 [1].

 

2. Time.deltaTime 그리고 Time.fixedDeltaTime

게임이나 앱을 실행하는 속도는 기기의 성능과 같은 환경적인 요인, 각 프레임마다 실행하는 코드 등에 영향을 받는다 [1]. 이는 모든 오브젝트의 이동, 회전과 같은 기능이 프레임마다 달라질 수 있다는 것을 의미한다. 이러한 속도의 변화에 영향을 받지 않고 동일하게 동작하도록 프레임과 프레임이 호출되는 시간을 측정한 값을 사용한다. 실제로는 동일하지 않지 않으며 근사치에 가깝다.

마지막 프레임에서 그 이전 프레임 사이의 시간을 측정한 값이 Time.deltaTime이다. Update() 함수에서는 Time.deltaTime의 값을 사용하고, FixedUpdate()에서는 Time.fixedDeltaTime을 사용한다. 

 

3. Time.timeScale과 Update, FixedUpdate, Coroutine

Time.timeScale 값이 0일 경우에 Update() 함수는 호출이 된다.

Time.timeScale 값이 0일 경우에 FixUpdate() 함수는 호출되지 않는다.

Time.timeScale 값이 0일 경우에 WaitForSeconds를 사용하는 Coroutine은 호출되지 않는다 [2]. 

 

반응형

4. Time.timeScale

Time.timeScale은 시간이 흐르는 값을 조절하는 값이다. 기본 값은 1.0으로 현실시간과 동일하게 흐른다. 음수 값은 무시되며, 게임이나 앱 안에서의 시간은 0.0으로 설정하면 정지하고 2.0으로 설정하면 시간의 흐름은 2배가 된다.  이를 이용하여 게임이나 앱을 일시 정지하는 효과, 시간을 가속하는 효과를 연출할 수 있다.

아래의 예제는 Time.timeScale 값을 제로로 변경하여 일시 정하는 코드이다.

using UnityEngine;

public class TimeScaler : MonoBehaviour
{
   // Update is called once per frame
   void Update()
   {
      if(Input.GetKeyDown(KeyCode.P))
      {
         Pause();
      }
      if(Input.GetKeyDown(KeyCode.R))
      {
         Resume();
      }
   }
   
   void Pause()
   {
      Time.timeScale = 0.0f;
   }
   
   void Resume()
   {
      Time.timeScale = 1.0f;
   }
}

 

5. Time.realtimeSinceStartup

Time.realtimeSinceStartup은 애플리케이션이 시작한 후의 시간을 측정한 값이다. Time.timeScale 값에 영향을 받지 않는다. 

아래의 예제는 Time.realtimeSinceStartup의 값을 계산하여, 애플리케이션을 실행한 이후의 경과한 시간을 출력하는 코드이다.  

using UnityEngine;

public class GamePlayTime : MonoBehaviour
{
   // Update is called once per frame
   void Update()
   {  
      float hour = Mathf.Floor(Time.realtimeSinceStartup / 3600.0f);
      Debug.Log("You are playing " + hour + " hour.");
   }
}

 

728x90

6. Time.timeSinceLevelLoad

Time.timeSinceLeveLoad은 Addictive Scene을 제외한 마지막 씬이 로딩된 이후부터 시간을 측정한 값이다. Time.timeScale 값에 영향을 받는다. 

아래의 예제는 Time.timeSinceLevelLoad를 사용하여, 씬이 호출된 이후의 경과 시간을 시간, 분, 초로 나누어 표시하는 코드이다.

using UnityEngine;

public class CalculatePlayTime : MonoBehaviour
{   
   // Update is called once per frame
   void Update()
   {
      CalPlayTime();
   }
   
   void CalPlayTime()
   {
      float time = Time.timeSinceLevelLoad;

      float hour = Mathf.Floor(time / 3600.0f);
      time %= 3600.0f;
      float minute = MathF.Floor(time / 60.0f);
      float second = time % 60.0f;
      Debug.Log("hour:" + hour);
      Debug.Log("Minute:" + minute);
      Debug.Log("Second :" + second);
   }
}

 

7. Time.time

Time.time은 애플리케이션의 시작 이후 시간을 측정한 값이다. 애플리이션이 시작하면 0의 값을 가진다.  

Time.timeScale 값에 영향을 받는다.

아래의 예제는 Time.time 값을 사용하여, 스카이박스에 회전 효과를 주는 코드이다. 

using UnityEngine;

public class SkyBoxRotation : MonoBehaviour
{
   public float rotationSpeed = 1.0f
   // Update is called once per frame
   void Update()
   {
      RenderSettings.skybox.SetFloat("_Rotation", Time.time * rotationSpeed);
   }
}

 

8. Time.deltaTime

Time.deltaTime은 마지막 프레임이 그 이전 프레임에서 호출되기까지 걸린 시간이다. Update() 함수와 함께 주로 사용된다. 캐릭터나 오브젝트의 이동과 같이 트랜스폼을 사용할 경우에는 Time.deltaTime을 함께 연산한다. 

Time.timeScale 값에 영향을 받는다.

아래의 예제는 Time.deltaTime의 값을 사용하여, 오브젝트를 지속적으로 전방으로 이동하도록 하는 코드이다.

using UnityEngine;

public class Move : MonoBehaviour
{
   public moveSpeed = 1.0f;
   // Update is called once per frame
   void Update()
   {
      MoveForward();
   }
   
   void MoveForward()
   {
      transform.Translate(moveSpeed * Time.deltaTime * Vector3.forward, Space.Self);
   }
}

 

9. Time.fixedDeltaTime

Time.fixedDeltaTime은 FixedUpdate 함수가 호출되는 간격이다. FixedUpdate 함수에서 사용되며 물리 연산이 실행되는 간격이다. Time.fixedDeltaTime은 Time.timeScale값에 영향을 받지 않지만 FixedUpdate 함수는 호출되지 않는다.

아래의 예제는 Time.fixedDeltaTime의 값과 Rigidbody 컴포넌트를 사용해 오브젝트의 위치를 변경하는 코드이다.  

using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
public class Move : MonoBehaviour
{
   public float moveSpeed = 1.0f;
   
   Rigidbody attachedRigidbody;
   // Start is called before the first frame
   void Start()
   {
      attachedRigidbody = GetComponent<Rigidbody>();
   }
   // FixedUpdate is called once per Fixed frame rate
   void FixedUpdate()
   {
      MoveForward();
   }
   
   void MoveForward()
   {
      attachedRigidbody.position += moveSpeed * Time.fixedDeltaTime * transform.forward;      
   }
}

 

References

[1] Time

https://docs.unity3d.com/kr/2022.3/Manual/TimeFrameManagement.html

 

중요 클래스 - Time - Unity 매뉴얼

Unity의 Time 클래스가 제공하는 중요한 기본 프로퍼티를 사용하여 프로젝트에서 시간과 관련된 값으로 작업할 수 있습니다.

docs.unity3d.com

[2] Time.timeScale

https://docs.unity3d.com/kr/2022.3/ScriptReference/Time-timeScale.html

 

Time-timeScale - Unity 스크립팅 API

The scale at which time passes.

docs.unity3d.com

 

 

728x90
반응형