출처: https://bluemeta.tistory.com/3
1. Time.timeScale이란?
원래 스케일(Scale)이란 단어의 뜻이 규모, 등급 등을 나타내듯이, 유니티에서 Time.timeScale 프로퍼티는 시간이 어떤 속도로 흘러가는지를 의미합니다. Time.timeScale의 값이 1.0f라면 현재 유니티 씬의 시간이 실제 시간(real time)으로 흐른다는 것을 의미합니다.
반면에 0.5f라면 시간이 흐르는 속도가 절반이 된다는 의미입니다.
만약 0.0f라면 모든 게임오브젝트가 정지합니다. 즉, 정지/포즈(pause) 상태를 구현할 수 있습니다.
당연히 2.0f라면 2배의 속도로 움직이겠죠.
다만 Time.timeScale 프로퍼티는 정적 프로퍼티(static property)이기 때문에 모든 씬의 게임오브젝트들이 공유하고 있습니다. 그러므로 Time.timeScale의 값을 변경하면 씬의 모든 게임오브젝트가 영향을 받습니다.
아래 코드를 확인해보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour {
void Update() {
if (Input.GetButtonDown("Fire1")) {
if (Time.timeScale == 1.0F)
Time.timeScale = 0.7F;
else
Time.timeScale = 1.0F;
Time.fixedDeltaTime = 0.02F * Time.timeScale;
}
}
}
|
cs |
위 코드를 보면 "Fire1" 키를 누르고 있는 동안은 Time.timeScale이 0.7f로 바뀌는 것을 알 수 있습니다. 즉 키를 누르고 있는 동안 시간이 0.7배의 속도로 흐르게 되는 것이죠.
그런데 조금 더 자세히 보니까 Time.fixedDeltaTime도 바꾸는 코드가 있네요?
2. Time.fixedDeltaTime도 함께 바꾸기
그리고 또 하나 중요한 것! 유니티 문서에 따르면 Time.timeScale을 바꾸었을 때는 Time.fixedDeltaTime도 수정하길 권장하고 있습니다.
위 코드의 11번째 줄을 보면 Time.fixedDeltaTime = 0.02f * Time.timeScale이라는 코드를 볼 수 있는데요. 여기서 0.02f는 유니티 엔진이 물리 연산을 담당하는 FixedUpdate() 메소드를 초당 50회(1초/50회 = 0.02f) 호출하기 때문입니다. 그리고 유니티에서 물리 연산을 담당하는 타이머는 별도의 타이머로 동작하기 때문에 Time.timeScale에 변화를 주었다면 Time.fixedDeltaTime도 수정하는 것입니다.
3. 만약 특정 게임오브젝트의 타임스케일을 바꾸고 싶다면?
딱히 이를 위한 프로퍼티가 있는 것은 아닙니다. 스크립트를 통해서 구현해야만 합니다. 다만 아래의 방법을 생각해볼 수 있을 것 같습니다.
- 메카님(Mecanim) 애니메이션 : Animator.speed라는 프로퍼티가 있습니다. 이 값을 조절할 수 있습니다.
- 리지드바디(Rigidbody) 유니티 물리 엔진 : 힘을 가해주는(속도를 변화시키는) Rigidbody.AddForce(), 토크를 가해주는(각속도를 변화시키는 Rigidbody.AddTorque() 메소드 등의 패러미터 값을 조절해주어야 합니다.
- 트랜스폼(Transform) : 마찬가지로 Transform.Translate(), Transform.Rotate() 메소드 등의 패러미터 값을 조절해주어야 합니다.
디아블로3의 위저드 스킬인 감속 지대를 구현하려면?
4. 정리
- Time.timeScale 프로퍼티는 모든 게임오브젝트의 시간 어떤 속도로 흘러가는지를 나타낸다. 기본값은 1.0f이다.
- Time.timeScale 프로퍼티를 바꾸었다면 Time.fixedDeltaTime 역시 바꾸는 것이 좋다. (Time.fixedDeltaTime = 0.02f * Time.timeScale)
- 예를 들어 Time.timeScale 프로퍼티가 0.0f이면 정지/포즈 상태를, 2.0f이면 2배로 시간이 빨리 흘러가는 것을 구현할 수 있다.
- 특정 게임오브젝트의 타임스케일을 바꾸기 위해서는 각 컴포넌트(Animator, Rigidbody, Transform 등)에 맞는 방법을 사용해야 한다.
'게임 관련 > 유니티' 카테고리의 다른 글
[C#][Unity]List에서 원소 제거시 주의할 점 (0) | 2023.10.23 |
---|---|
유니티 - 프리팹 Load하는 3가지 방법 (0) | 2023.10.11 |
C# 제네릭 (Generics) 타입 이란? (0) | 2022.10.23 |
[유니티 기초] 은근 유용한 [Serializable], [SerializeField] 사용하기 (0) | 2022.10.23 |
유니티 싱글톤 개념 잡기 #2 (0) | 2022.10.23 |