Menu
CoddyTech

timeScale로 일시 정지

Coddy Unity 여정의 실제 게임 만들기 섹션에 포함된 레슨. 60개 중 34번째.

Time.timeScale은 게임 시간이 흐르는 속도를 뜻합니다. 1이면 정상 속도이고 0이면 시간이 멈춥니다. 값이 0이면 Time.deltaTime도 0이므로 speed * Time.deltaTime으로 작성한 모든 움직임이 멈춥니다. FixedUpdate()는 더 이상 호출되지 않아 Rigidbody가 공중에 멈춰 있고, 게임 시간을 기준으로 시간을 세는 WaitForSeconds와 Invoke도 기다립니다. 이 스크립트는 On Click 목록에서 TogglePause를 호출하는 버튼으로 일시 정지를 전환하고, 일시 정지 중에는 패널을 표시합니다.

public class PauseToggle : MonoBehaviour
{
    public GameObject pausePanel;
    bool paused;

    public void TogglePause()
    {
        paused = !paused;
        Time.timeScale = paused ? 0f : 1f;
        pausePanel.SetActive(paused);
    }
}

모든 것이 멈추는 것은 아닙니다. Update()와 LateUpdate()는 매 프레임 계속 호출되지만 Time.deltaTime은 0입니다. 코루틴의 yield return null은 여전히 다음 프레임에 돌아오고, UI도 계속 클릭을 받을 수 있으므로 버튼으로 일시 정지를 해제할 수 있습니다. 키 입력도 계속 읽힙니다. 따라서 Update()에서 Space 키를 누르면 점프하는 개구리는 일시 정지 중 입력을 받아 두었다가, 일시 정지가 풀린 뒤 첫 번째 물리 업데이트에서 뛰어오릅니다. 시간이 멈춰 있는 동안 키 입력을 무시하도록 스크립트에서 처리합니다.

void Update()
{
    if (Time.timeScale == 0f) return;   // 일시 정지 상태: 키 입력을 무시합니다
    if (Input.GetKeyDown(KeyCode.Space))
    {
        rb.AddForce(Vector3.up * jump, ForceMode.Impulse);
    }
}

Time.timeScale은 장면이 아니라 게임 전체에 적용됩니다. 값이 0인 상태에서 다른 장면을 불러오면 새 장면도 일시 정지된 채로 시작합니다. 레벨을 다시 시작하거나 종료하는 메뉴 버튼은 먼저 값을 1로 되돌립니다.

challenge icon

챌린지

중급

테니스 코트에 일시 정지 메뉴를 추가하세요. 장면에서 일시 정지 및 재개 버튼을 연결합니다.

  1. PauseMenu.cs에서 Pause()는 Time.timeScale = 0f;를 설정하고 panel.SetActive(true);를 호출합니다.
  2. Resume()는 Time.timeScale = 1f;를 설정하고 panel.SetActive(false);를 호출합니다.
  3. BallMachine.cs에서 Update()의 Space 키 확인문 위에 if (Time.timeScale == 0f) return;을 추가하세요.

‘플레이’를 누르고 공을 서브한 다음 일시 정지하세요. 공이 공중에 멈춥니다. 그런 다음 ‘확인’을 누르세요.

직접 해보기

using UnityEngine;

public class PauseMenu : MonoBehaviour
{
    public GameObject panel;

    public void Pause()
    {
        // 게임 시간을 멈추고 패널을 표시합니다
    }

    public void Resume()
    {
        // 게임 시간이 다시 정상 속도로 흐르고 패널은 숨겨집니다
    }
}

실제 게임 만들기의 모든 레슨

직접 연습해 보세요: Unity 플레이그라운드