【学習】Unity:アイテム所持とセーブ入門(第8回)― メニュー全体:Menu でポーズとアイテム画面を繋ぐ
第7回 で、アイテム一覧は ItemsDialog.Toggle() があれば用意できました。
あとはプレイヤーから いつでも止められるようにしつつ、その 親メニューから 一覧を開閉するだけです。
書籍準拠のサンプルでは Menu.cs が
Time.timeScaleで ゲーム時間の進行/停止(ポーズ)- Resume で時間を 1 に戻す
- アイテムボタンから
ItemsDialog.Toggleを呼ぶ
をひとつのスクリプトにまとめています。
シリーズ
今日のゴール
Time.timeScaleを0にするとゲーム側の時間が進まないことを理解する(ポーズ UI)ResumeでTime.timeScale = 1に戻せるitemsDialog.Toggle()と UI のButtonをonClickでひも付けられる
インスペクタで張るもの
[SerializeField] |
種類・役割 |
|---|---|
itemsDialog |
第7回 の ItemsDialog |
pauseButton/resumeButton |
ポーズに入る・戻る |
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の 状態管理だけが甘いと不具合に繋がるので、PauseとResumeの ペアを明確にする recipeButtonは未完 … ほかウィンドウを足すときの ひな型になっています
発展アイデア
- ポーズ中だけインベントリを開ける、といった ルール分岐
Time.timeScale以外にも入力禁止(Cursor.lockState、PlayerInput.enabled)を足す話- いきのこバトル:所持品データとオーディオ への 音声・コンプリート編との接続
シリーズに戻る
UI の一周ができました。所持データの復習や設計を深めるなら、シングルトン周りへ。
→ 目次(00)