🎮 UnityDocs

Sistema de crafting

Un sistema de fabricación limpio: las recetas como ScriptableObjects (ingredientes → resultado), comprobar el inventario, consumir materiales y entregar el objeto. Se apoya en el sistema de inventario.

🍳 RecetaAvanzado✅ RevisadoUnity 6.0 LTSActualizado 2026-07-15
DificultadConceptual Código Matemáticas
Tiempo📖 Lectura 7 min · ⌨️ Práctica 30 min

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#

C#
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:

C#
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#

C#
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;
    }
}
Comprueba TODO antes de consumir NADA

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.

Fuentes y para profundizar