timeScale로 일시 정지
Coddy Unity 여정의 실제 게임 만들기 섹션에 포함된 레슨. 56개 중 33번째.
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로 되돌립니다.
챌린지
중급테니스 코트의 공 발사 장치는 왼쪽 및 오른쪽 화살표 키로 회전하고 Space 키를 누르면 공을 발사합니다(BallMachine.cs). 코트에 일시 정지 메뉴를 추가하세요(PauseMenu.cs). 씬에서 Pause 버튼은 Pause()에 연결하고, 숨겨진 PausePanel에 있는 Resume 버튼은 Resume()에 연결합니다. Inspector에서 패널을 panel에 할당합니다.
Pause()는 게임 시간을 멈추고 패널을 표시합니다.Resume()은 게임 시간을 정상 속도로 되돌리고 패널을 숨깁니다.BallMachine.cs에서 게임이 일시 정지된 동안 Space 키를 눌러도 공을 발사하면 안 됩니다. 회전 코드는Time.deltaTime을 사용하므로 변경할 필요가 없습니다.
Play를 눌러 공을 발사하고 공중에 있는 동안 일시 정지한 다음 Check를 누르세요.
직접 해보기
using UnityEngine;
public class PauseMenu : MonoBehaviour
{
public GameObject panel;
public void Pause()
{
// 게임 시간을 멈추고 panel을 표시합니다
}
public void Resume()
{
// 게임 시간이 다시 정상 속도로 흐르고 panel은 숨겨집니다
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.