Menu
CoddyTech

Выбор и удаление слота

Часть раздела Архитектура игр в Unity путешествия по Unity на Coddy. Урок 34 из 64.

В этой главе мы записывали сохранения в формате JSON: класс сохранения [System.Serializable], файлы в Application.persistentDataPath и инициализаторы полей, которые заполняют недостающие данные в старом сохранении. Теперь в меню слотов появляются два последних элемента управления.

challenge icon

Задание

Средне

Позвольте игроку выбрать слот и удалить его.

  1. В Update() стрелка вниз увеличивает selected на 1, а стрелка вверх уменьшает его на 1; значение ограничивается диапазоном от 0 до 2 с помощью Mathf.Min и Mathf.Max. Затем вызывается 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