Menu
CoddyTech

スロットを選択して削除

CoddyのUnityジャーニー「Unityのゲームアーキテクチャ」セクションの一部。レッスン 34/64。

この章では、セーブデータをJSONとして書き込みました。具体的には、[System.Serializable]属性を付けたセーブ用クラス、Application.persistentDataPath内のファイル、そして古いセーブデータに不足している値を補うフィールド初期化子を扱いました。これでスロットメニューに残る2つの操作項目を追加できます。

challenge icon

チャレンジ

中級

プレイヤーがスロットを選択して削除できるようにします。

  1. Update()では、下矢印キーでselectedに1を加え、上矢印キーで1を引きます。Mathf.MinとMathf.Maxを使って、値を0から2の範囲に保ちます。その後、Show()を呼び出します。
  2. DeleteSelected()は、File.Deleteで選択中のスロットのファイルを削除し、そのスロットをnullに設定して、Show()を呼び出します。

「プレイ」を押し、スロット3を埋めてから「削除」をクリックします。空と表示されます。その後、「確認」を押します。

自分で試してみよう

using System.IO;
using UnityEngine;
using UnityEngine.InputSystem;
using TMPro;

public class SlotMenu : MonoBehaviour
{
    public TMP_Text[] slotTexts;
    private SlotSave[] slots = new SlotSave[3];
    private int selected;

    void Start()
    {
        for (int i = 0; i < slots.Length; i++)
        {
            if (File.Exists(PathFor(i)))
            {
                slots[i] = JsonUtility.FromJson<SlotSave>(File.ReadAllText(PathFor(i)));
            }
        }
        Show();
    }

    void Update()
    {
        // 矢印キーでスロットを選択する
        if (Keyboard.current.spaceKey.wasPressedThisFrame)
        {
            if (slots[selected] == null)
            {
                slots[selected] = new SlotSave();
            }
            else
            {
                slots[selected].day++;
                slots[selected].gold += 15;
            }
            File.WriteAllText(PathFor(selected), JsonUtility.ToJson(slots[selected]));
            Show();
        }
    }

    // Deleteボタンがこれを呼び出す
    public void DeleteSelected()
    {
    }

    string PathFor(int index)
    {
        return Path.Combine(Application.persistentDataPath, "slot" + (index + 1) + ".json");
    }

    void Show()
    {
        for (int i = 0; i < slots.Length; i++)
        {
            string line = "Slot " + (i + 1) + ": ";
            if (slots[i] == null)
            {
                line += "empty";
            }
            else
            {
                line += "Day " + slots[i].day + ", " + slots[i].gold + " gold";
            }
            if (i == selected)
            {
                line = "> " + line;
            }
            slotTexts[i].text = line;
        }
    }
}
quiz icon腕試し

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

Unityのゲームアーキテクチャのすべてのレッスン

自分で練習してみよう: Unityプレイグラウンド