Menu
CoddyTech

timeScaleで一時停止

CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 34/60。

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()でスペースキーを押すとジャンプするカエルは、一時停止中のキー入力を受け取り、一時停止解除後の最初の物理演算ステップで跳び上がってしまいます。時間が止まっている間はキー入力を無視するように、スクリプトで処理します。

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

チャレンジ

中級

テニスコートにポーズメニューを追加しましょう。シーンでは「Pause」ボタンと「Resume」ボタンが接続されています。

  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プレイグラウンド