学習記事一覧 · Unity

【学習】Unity:アイテム所持とセーブ入門(第8回)― メニュー全体:Menu でポーズとアイテム画面を繋ぐ

第7回 で、アイテム一覧は ItemsDialog.Toggle() があれば用意できました。

あとはプレイヤーから いつでも止められるようにしつつ、その 親メニューから 一覧を開閉するだけです。

書籍準拠のサンプルでは Menu.cs

  • Time.timeScaleゲーム時間の進行/停止(ポーズ)
  • Resume で時間を 1 に戻す
  • アイテムボタンから ItemsDialog.Toggle を呼ぶ

をひとつのスクリプトにまとめています。

シリーズ


今日のゴール

  • Time.timeScale0 にするとゲーム側の時間が進まないことを理解する(ポーズ UI
  • ResumeTime.timeScale = 1 に戻せる
  • itemsDialog.Toggle()UI の ButtononClick でひも付けられる

インスペクタで張るもの

[SerializeField] 種類・役割
itemsDialog 第7回ItemsDialog
pauseButtonresumeButton ポーズに入る・戻る
pausePanel メニューを載せた 親パネル(視覚的に「止まっている」画面)
itemsButton アイテム一覧の開閉
recipeButton 教材では 後追い。今は TODO

完成コード

using UnityEngine;
using UnityEngine.UI;
public class Menu : MonoBehaviour
{
    [SerializeField] private ItemsDialog itemsDialog;
    [SerializeField] private Button pauseButton;
    [SerializeField] private GameObject pausePanel;
    [SerializeField] private Button resumeButton;
    [SerializeField] private Button itemsButton;
    [SerializeField] private Button recipeButton;
    private void Start()
    {
        pausePanel.SetActive(false); // ポーズのパネルは初期状態では非表示にしておく
        pauseButton.onClick.AddListener(Pause);
        resumeButton.onClick.AddListener(Resume);
        itemsButton.onClick.AddListener(ToggleItemsDialog);
        recipeButton.onClick.AddListener(ToggleRecipeDialog);
    }
    /// <summary>
    /// ゲームを一時停止します。
    /// </summary>
    private void Pause()
    {
        Time.timeScale = 0; // Time.timeScaleで時間の流れの速さを決める。0だと時間が停止する
        pausePanel.SetActive(true);
    }
    /// <summary>
    /// ゲームを再開します。
    /// </summary>
    private void Resume()
    {
        Time.timeScale = 1; // また時間が流れるようにする
        pausePanel.SetActive(false);
    }
    /// <summary>
    /// アイテムウインドウを開閉します。
    /// </summary>
    private void ToggleItemsDialog()
    {
        itemsDialog.Toggle();
    }
    /// <summary>
    /// レシピウインドウを開閉します。
    /// </summary>
    private void ToggleRecipeDialog()
    {
        // TODO 後で実装
    }
}

プログラムの流れ

Pause が押される

timeScale = 0

pausePanel を表示
Resume が押される

timeScale = 1

pausePanel を隠す
itemsButton が押される

ItemsDialog.Toggle(表示ならリスト更新)

重要ポイント

  • Time.timeScale = 0 でも動く処理Update() は止まりがちですが、イベント駆動の UI(Button は反応できる想定です。教材では 一覧の Toggle と組み合わせて体感します
  • 二重ポーズなどtimeScale状態管理だけが甘いと不具合に繋がるので、PauseResumeペアを明確にする
  • recipeButton は未完 … ほかウィンドウを足すときの ひな型になっています

発展アイデア


シリーズに戻る

UI の一周ができました。所持データの復習や設計を深めるなら、シングルトン周りへ。

目次(00)