Menu
CoddyTech

timeScaleで一時停止

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

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

チャレンジ

中級

テニスコートのボールマシンは左右の矢印キーで向きを変え、Spaceキーでボールを発射します(BallMachine.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()
    {
        // ゲーム内の時間を停止し、パネルを表示する
    }

    public void Resume()
    {
        // ゲーム内の時間を通常の速度に戻し、パネルを非表示にする
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

本格的なゲームを作るのすべてのレッスン