Unityの2Dゲームでゲーム中の画面を「一時停止/再開」するのを実装していきます。
はじめに
Unityのバージョンは「2021.3.14f1」で作成しています。
ゲームを「一時停止/再開」する簡易的な機能を実装していきます。
画像は下記を利用していきます。私がInkscapeで簡単に作成したものです。下記2つの画像をUnityに取り込んでおきます。


実装開始
「UI」→「Legacy」→「Button」を追加します。

ButtonのSourceImageに停止ボタン画像をセットしてサイズを合わせます。ボタンの配下のTextは削除しておきます。

スクリプトの作成
下記スクリプトを作成します。
using UnityEngine; using UnityEngine.UI; public class Pause : MonoBehaviour { [SerializeField] private Sprite pause; [SerializeField] private Sprite play; private Button btn; private void Start() { btn = GetComponent<Button>(); btn.image.sprite = pause; } public void ChangeControll() { if (btn.image.sprite == pause) { Time.timeScale = 0; btn.image.sprite = play; } else { Time.timeScale = 1; btn.image.sprite = pause; } } }
「Time.timeScale=0」で時間停止しています。現在の画像で処理を分けています。
「Time.timeScale」の詳しい説明は下記リファレンスにあります。
ボタンオブジェクトにスクリプトを追加して、各パラメータに画像をセットします。また、OnClick()に関数を呼び出すように割り当てます。

実行すると下記のような感じに「停止/再開」ができます。画面中央の数字は時間経過を表示するタイマーです。停止時に時間が進まなければOKです。

簡易的な「停止/再開ボタン」が完成です。
停止時に設定などを表示
次に、停止したときに再開以外に設定やメニューに戻るなどを追加したい場合です。
「UI」→「Panel」を追加します。

パネルの配下に再開ボタン、メニューに戻るボタンなどをセットします。(今回は再開ボタンのみ)

スクリプトを下記に変更します。パネルの「有効/無効」を切り替えています。
using UnityEngine; public class Pause : MonoBehaviour { [SerializeField] private Sprite pause; [SerializeField] private GameObject PausePanel; [SerializeField] private GameObject btn; private void Start() { PausePanel.SetActive(false); } public void ChangeControll() { if (!PausePanel.activeSelf) { Time.timeScale = 0; PausePanel.SetActive(true); btn.SetActive(false); } else { Time.timeScale = 1; PausePanel.SetActive(false); btn.SetActive(true); } } }
スクリプトのパラメータをセットします。

パネルの配下のボタンのOnClock()にも割り当てます。

実行すると下記のような感じに。停止したときにパネルが表示されます。ここに設定などを表示することで変更することができます。
