El plan#
Fabricar = comprobar que tienes los ingredientes, consumirlos y entregarte el resultado. Definiremos las recetas como datos (ScriptableObjects) y usaremos el sistema de inventario que ya tienes. Reutilizamos su ItemData.
Paso 1 — La receta como dato#
using UnityEngine;
[System.Serializable]
public class Ingrediente
{
public ItemData item;
public int cantidad;
}
[CreateAssetMenu(fileName = "Receta", menuName = "Crafting/Receta")]
public class RecetaCrafting : ScriptableObject
{
public Ingrediente[] ingredientes; // lo que necesitas
public ItemData resultado; // lo que obtienes
public int cantidadResultado = 1;
}Cada receta ("Poción = 2 Hierbas + 1 Agua") es un asset que creas y ajustas sin tocar código.
Paso 2 — Añadir consultas al inventario#
El crafting necesita saber cuántos de un ítem tienes. Añade este método a tu Inventario:
public int Contar(ItemData item)
{
int total = 0;
foreach (var r in ranuras)
if (r.item == item) total += r.cantidad;
return total;
}Paso 3 — El fabricador#
using UnityEngine;
public class Crafteo : MonoBehaviour
{
[SerializeField] private Inventario inventario;
public bool PuedeFabricar(RecetaCrafting receta)
{
foreach (var ing in receta.ingredientes)
if (inventario.Contar(ing.item) < ing.cantidad)
return false; // falta algún ingrediente
return true;
}
public bool Fabricar(RecetaCrafting receta)
{
if (!PuedeFabricar(receta)) return false;
// Consumir ingredientes
foreach (var ing in receta.ingredientes)
inventario.Quitar(ing.item, ing.cantidad);
// Entregar el resultado
inventario.Añadir(receta.resultado, receta.cantidadResultado);
return true;
}
}El orden importa: primero verifica que tienes todos los ingredientes (PuedeFabricar), y solo entonces consume. Si consumieras a la vez que compruebas, un fallo a mitad te dejaría sin los materiales ya gastados y sin resultado. Verificar-luego-actuar evita ese estado corrupto.
Paso 4 — La UI de crafteo#
Muestra la lista de recetas; para cada una, si PuedeFabricar es true, el botón está activo. Al pulsarlo, llamas a Fabricar y el inventario avisa por su evento AlCambiar para refrescar todo. La UI de crafteo no necesita saber nada de la lógica: solo pinta recetas y llama a Fabricar.
Extras habituales#
- Requisitos extra: una estación de crafteo cercana (una fragua), un nivel mínimo, tiempo de fabricación (con corrutina).
- Descubrimiento de recetas: recetas que empiezan ocultas y se desbloquean.
- Fabricación por lotes y previsualización de lo que obtendrás.
- Devolver materiales al desmontar un objeto.
Errores frecuentes#
- Consumir ingredientes antes de comprobar que están todos.
- Meter los datos de la receta en código en vez de un ScriptableObject (imposible de balancear).
- Acoplar la UI a la lógica en vez de reaccionar al evento del inventario.
- No comprobar el hueco en el inventario al entregar el resultado (inventario lleno).
Resumen#
Define las recetas como ScriptableObjects (ingredientes → resultado), añade un método Contar al inventario, y en el fabricador comprueba todos los ingredientes antes de consumir ninguno, luego resta materiales y entrega el resultado. La UI solo pinta recetas y llama a Fabricar, reaccionando al evento del inventario. Amplíalo con estaciones, tiempos y descubrimiento de recetas.