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.
Desafío
DifícilInventory:
- Una clase
[System.Serializable]ItemStackconpublic string itemypublic int count, y una clase[System.Serializable]InventoryDataconpublic List<ItemStack> stacks. El inventario conserva unInventoryData. 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, comoWood 3, Plank 1, o devuelveempty.- Cada cambio se guarda inmediatamente en
inventory.json, enApplication.persistentDataPath, como resultado deJsonUtility.ToJsonaplicado aInventoryData.Awakecarga 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]Ingredientconpublic string itemypublic int amount, y una clase[System.Serializable]Recipeconpublic string resultypublic List<Ingredient> needs.recipesdel banco es unaList<Recipe>, que se completa en la escena. - Los botones de recolección añaden uno de
Woodo uno deStone. Cada botón de receta llama apublic void Craft(int index)con el índice de su receta. Craftno 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, comoCrafted 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
inventoryTextmuestra la descripción después de la palabra Inventory, comoInventory: Wood 3, Plank 1oInventory: 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;
}
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
1Componentes, no jerarquías
Componentes pequeñosUn script base para enemigosComponentes abstractosComponentes que trabajan juntosRepaso: torreta modular4Datos serializados
Clases serializablesListas en el InspectorEnumeraciones en el InspectorRepaso: tabla de botín7Máquinas de estados
Estados como clasesUna máquina de estadosTransicionesCerebros de enemigosRepaso: estados de puertas10Proyecto: Superviviente de la arena
El héroeTipos de enemigos2Interfaces en Unity
IDamageableInterfaces y TryGetComponentGetComponentsRepaso: tecla de interacción5ScriptableObjects
Recursos de datosEstadísticas de armasConfiguración compartidaOleadas como datosRepaso: base de datos de objetos