본문 바로가기
개발/Unity

유니티 - 스크립트로 게임 일시정지하기 (Unity Pause by Scirpt)

by 피로물든딸기 2022. 6. 10.
반응형

Unity 전체 링크

 

유니티에서 게임을 멈추는 방법(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:

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Unity Pro:

 

Unity Pro

The complete solutions for professionals to create and operate.

unity.com

 

Unity 프리미엄 학습:

 

Unity Learn

Advance your Unity skills with live sessions and over 750 hours of on-demand learning content designed for creators at every skill level.

unity.com

반응형

댓글