Menu
CoddyTech

Верстак для крафта

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

В игре на выживание верстак превращает собранные ресурсы в полезные предметы. Две кнопки собирают дерево и камень, а три рецепта позволяют изготовить из них новые предметы: из двух единиц дерева получается доска, из доски и двух единиц камня — топор, из четырёх досок — плот. Кнопку рецепта можно нажать только тогда, когда в инвентаре есть всё необходимое для его изготовления, а при создании предмета эти ресурсы расходуются. Данные рецептов заполняются на верстаке в Inspector, поэтому для добавления нового рецепта не нужен новый код. Инвентарь сообщает обо всех изменениях всем, кто подписан на уведомления, а при каждом изменении сохраняется в формате JSON, поэтому при выходе из игры ничего не теряется.

Напиши два скрипта: Inventory для объекта Backpack и CraftingBench для объекта Bench.

challenge icon

Задание

Сложно

Inventory:

  • Класс [System.Serializable] ItemStack с полями public string item и public int count, а также класс [System.Serializable] InventoryData с полем public List<ItemStack> stacks. Инвентарь хранит один объект InventoryData.
  • public event Action Changed, вызывается после каждого изменения.
  • public int Count(string item): сколько предметов данного типа хранится в инвентаре; 0, если таких предметов нет.
  • public void Add(string item, int amount) добавляет предметы в стопку этого предмета или добавляет новую стопку в конец списка. public void Remove(string item, int amount) забирает предметы из стопки, а стопка, количество предметов в которой достигает 0, удаляется из списка.
  • public string Describe() перечисляет стопки по порядку, например Wood 3, Plank 1, или возвращает empty.
  • Каждое изменение сразу сохраняется в inventory.json по пути Application.persistentDataPath в виде результата вызова JsonUtility.ToJson для InventoryData. Awake загружает этот файл, если он существует.

CraftingBench, которому через Inspector назначаются inventory, recipes, recipeButtons (по одной кнопке на рецепт, в том же порядке), woodButton, stoneButton и inventoryText:

  • Класс [System.Serializable] Ingredient с полями public string item и public int amount, а также класс [System.Serializable] Recipe с полями public string result и public List<Ingredient> needs. Поле recipes объекта CraftingBench имеет тип List<Recipe> и заполняется в сцене.
  • Кнопки сбора добавляют одну единицу Wood или Stone. Каждая кнопка рецепта вызывает public void Craft(int index) с индексом этого рецепта.
  • Craft ничего не делает, если в инвентаре не хватает какого-либо из необходимых для рецепта предметов. В противном случае удаляет все ингредиенты, добавляет одну единицу результата и записывает его в журнал, например Crafted Axe.
  • В начале работы и при каждом изменении инвентаря каждая кнопка рецепта доступна для нажатия, только если этот рецепт можно изготовить, а inventoryText показывает описание после слова Inventory, например Inventory: Wood 3, Plank 1 или Inventory: empty.

Нажми Play, собери материалы и изготовь плот, нажми Stop, а затем снова Play, после чего нажми Check.

Попробуйте сами

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;

public class CraftingBench : MonoBehaviour
{
    [SerializeField] private Inventory inventory;
    [SerializeField] private Button[] recipeButtons;
    [SerializeField] private Button woodButton;
    [SerializeField] private Button stoneButton;
    [SerializeField] private TMP_Text inventoryText;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Архитектура игр в Unity