Menu
CoddyTech

Banco de creación

Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 49 de 50.

En un juego de supervivencia, una mesa de fabricación convierte lo que recolectas en cosas que puedes usar. Dos botones permiten recolectar madera y piedra, y tres recetas las convierten en más cosas: dos unidades de madera hacen una tabla, una tabla y dos unidades de piedra hacen un hacha, y cuatro tablas hacen una balsa. El botón de una receta solo se puede pulsar mientras el inventario tenga todo lo que necesita la receta, y al fabricar se consumen esos materiales. Los datos de las recetas se completan en la mesa desde el Inspector, así que una receta nueva no necesita código nuevo. El inventario anuncia cada cambio a quien esté escuchando, y se guarda como JSON cada vez que cambia, así que salir del juego no hace que pierdas nada.

Escribe dos scripts: Inventory, en la Mochila, y CraftingBench, en la Mesa.

challenge icon

Desafío

Difícil

Inventory:

  • Una clase [System.Serializable] ItemStack con public string item y public int count, y una clase [System.Serializable] InventoryData con public List<ItemStack> stacks. El inventario conserva un InventoryData.
  • public event Action Changed, que se activa después de cada cambio.
  • public int Count(string item): cuántos elementos de ese tipo contiene; 0 si no tiene ninguno.
  • public void Add(string item, int amount) los añade a la pila del elemento o añade una nueva pila al final de la lista. public void Remove(string item, int amount) los resta, y una pila que llega a 0 sale de la lista.
  • public string Describe() enumera las pilas en orden, como Wood 3, Plank 1, o devuelve empty.
  • Cada cambio se guarda inmediatamente en inventory.json, en Application.persistentDataPath, como resultado de JsonUtility.ToJson aplicado a InventoryData. Awake carga ese archivo si existe.

CraftingBench, al que el Inspector asigna inventory, recipes, recipeButtons (uno por receta, en el mismo orden), woodButton, stoneButton e inventoryText:

  • Una clase [System.Serializable] Ingredient con public string item y public int amount, y una clase [System.Serializable] Recipe con public string result y public List<Ingredient> needs. recipes del banco es una List<Recipe>, que se completa en la escena.
  • Los botones de recolección añaden uno de Wood o uno de Stone. Cada botón de receta llama a public void Craft(int index) con el índice de su receta.
  • Craft no hace nada cuando al inventario le falta alguno de los elementos necesarios para la receta. De lo contrario, elimina cada ingrediente, añade uno del resultado y lo registra, como Crafted Axe.
  • Al inicio y cada vez que cambia el inventario, cada botón de receta solo se puede pulsar si se puede fabricar su receta, y inventoryText muestra la descripción después de la palabra Inventory, como Inventory: Wood 3, Plank 1 o Inventory: empty.

Pulsa Play, recolecta materiales y fabrica una balsa, pulsa Stop y Play otra vez, y luego Check.

Pruébalo tú mismo

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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Arquitectura de juegos en Unity