유니티에서 게임을 멈추는 방법(Pause)은 두 가지가 있다.
- Time.timeScale을 변경하여 Time.deltaTime을 0으로 만들기
- EditorApplication.isPaused를 true로 변경하여 실제 게임을 멈추기
먼저 PauseTest.cs를 만들고 큐브 3개에 추가한다.
각 큐브를 누르면 public에서 설정한대로 timeScale이 변경되고 큐브에서 마우스를 떼면 원상태로 돌아간다.
즉, 원래 TimeScale은 1이다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PauseTest : MonoBehaviour
{
public float timeScale;
void OnMouseDown()
{
Time.timeScale = timeScale;
}
void OnMouseUp()
{
Time.timeScale = 1.0f; /* 원상 복구 */
}
void Update()
{
this.transform.Translate(Vector3.up * Time.deltaTime);
Debug.Log("Update : " + Time.deltaTime);
}
}
아래와 같이 큐브를 만들었으며, 왼쪽부터 순서대로 TimeScale 0.5 / 0 / 3 이다.
이제 Canvas를 추가하고 Text를 추가하자.
Text에는 UICount.cs를 추가한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UICount : MonoBehaviour
{
float timer;
float unscaleTimer;
Text thisText;
void Start()
{
thisText = this.GetComponent<Text>();
}
void Update()
{
timer += Time.deltaTime;
unscaleTimer += Time.unscaledDeltaTime;
int currentTime = (int)timer;
int currentUnscaleTimer = (int)unscaleTimer;
string showTime = "delta : " + currentTime + " / unscale : " + currentUnscaleTimer;
thisText.text = showTime;
}
}
Text 위치와 큐브를 적절히 옮기면 아래와 같은 씬을 만들 수 있다.
이제 게임을 시작해보자.
가운데 큐브를 누르면 timeScale이 0이 된다.
따라서 deltaTime이 0이 되고, 더 이상 Text의 currentTime이 누적되지 않는다.
그러나 timeScale과 무관한 unscaledDeltaTime은 여전히 카운트가 되기 때문에 unscaleTimer는 변한다.
왼쪽(파란) 큐브를 누르면 시간이 절반 속도로 흘러가고, 하얀 큐브를 누르면 3배의 속도로 흘러간다.
실제 플레이를 해서 결과를 확인해보자.
deltaTime은 큐브에 의존적이지만, unscaledDeltaTime은 실제 시간만큼 누적되고 있다.
게임이 일시정지 된 것처럼 보이더라도 시간이 멈춘 것이 아니기 때문에
오브젝트들의 스크립트에서 Debug.Log("Update : " + Time.deltaTime); 가 호출되고 있다.
즉, timeScale이 변함에 따라 deltaTime의 값만 변할 뿐, 스크립트가 멈추는 것은 아니다.
오브젝트가 deltaTime에 의존(transform.Translate)하는 경우에만 일시정지 효과를 볼 수 있다.
이제 TimeScale을 조절해서 게임을 멈추게 한 것처럼 보이는 것이 아니라, 실제로 플레이 씬을 멈춰보자.
즉, 로그가 많이 지나가는 상황에서 특정 상황에 실제로 게임을 멈추는 경우에 사용할 수 있다.
PauseTest.cs를 아래와 같이 수정한다.
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
public class PauseTest : MonoBehaviour
{
public float timeScale;
void OnMouseDown()
{
EditorApplication.isPaused = true;
}
void OnMouseUp()
{
EditorApplication.isPaused = false;
}
void Update()
{
this.gameObject.transform.Translate(Vector3.up * Time.deltaTime);
Debug.Log("Update : " + Time.deltaTime);
}
}
큐브를 누르면 실제로 Pause 버튼이 눌러진 것을 알 수 있다.
실제로 게임이 멈췄기 때문에 OnMouseUp에 의해 EditorApplication.isPaused = false;가 실행되지 않는다.
게임 자체가 멈췄기 때문에 실제 게임을 다시 실행하려면 Pause 버튼을 눌러야 한다.
이 방법은 원하는 동작에 EditorApplication.isPaused = false;를 끼워넣음으로써,
디버깅을 할 때 유용하게 사용할 수 있다.
좀 더 편한 방법은 콘솔 창에 Error Pause를 활성화하면 된다.
Unity Plus:
Unity Pro:
Unity 프리미엄 학습:
'개발 > Unity' 카테고리의 다른 글
유니티 쉐이더 - 카메라 흑백 효과로 게임 오버 이펙트 만들기 (Camera Game Over Effect) (0) | 2022.06.11 |
---|---|
유니티 - 전처리기 지시문을 사용하여 조건부 컴파일하기 (Scripting Define Symbols) (0) | 2022.06.10 |
유니티 쉐이더 - 속성 타입과 인터페이스 옵션 (Properties Type and Interface Attributes) (0) | 2022.06.06 |
유니티 - 스카이 박스 변경 (Skybox) (0) | 2022.06.01 |
유니티 C# - 확장 메서드 (Extension Method) / static method 의 this parameter (0) | 2022.05.30 |
댓글