Верстак для крафта
Часть раздела Архитектура игр в Unity путешествия по Unity на Coddy. Урок 49 из 50.
В игре на выживание верстак превращает собранные ресурсы в полезные предметы. Две кнопки собирают дерево и камень, а три рецепта позволяют изготовить из них новые предметы: из двух единиц дерева получается доска, из доски и двух единиц камня — топор, из четырёх досок — плот. Кнопку рецепта можно нажать только тогда, когда в инвентаре есть всё необходимое для его изготовления, а при создании предмета эти ресурсы расходуются. Данные рецептов заполняются на верстаке в Inspector, поэтому для добавления нового рецепта не нужен новый код. Инвентарь сообщает обо всех изменениях всем, кто подписан на уведомления, а при каждом изменении сохраняется в формате JSON, поэтому при выходе из игры ничего не теряется.
Напиши два скрипта: Inventory для объекта Backpack и CraftingBench для объекта Bench.
Задание
Сложно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;
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Архитектура игр в Unity
1Компоненты, а не иерархии
Небольшие компонентыБазовый скрипт врагаАбстрактные компонентыСовместная работа компонентовПовторение: модульная турель4Сериализованные данные
Сериализуемые классыСписки в InspectorПеречисления в InspectorПовторение: таблица лута2Интерфейсы в Unity
IDamageableИнтерфейсы и TryGetComponentGetComponentsПовторение: клавиша взаимодействия5ScriptableObjects
Ресурсы данныхХарактеристики оружияОбщие настройкиВолны как данныеПовторение: база предметов