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に戻します。
チャレンジ
中級テニスコートのボールマシンは左右の矢印キーで向きを変え、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()
{
// ゲーム内の時間を通常の速度に戻し、パネルを非表示にする
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。