Menu
CoddyTech

Banco da lavoro

Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 49 di 50.

In un gioco di sopravvivenza, un banco da lavoro trasforma ciò che raccogli in oggetti che puoi usare. Due pulsanti permettono di raccogliere legno e pietra, e tre ricette li trasformano in altro: due pezzi di legno fanno una tavola, una tavola e due pietre fanno un'ascia, quattro tavole fanno una zattera. Il pulsante di una ricetta può essere premuto solo quando l'inventario contiene tutto ciò che serve per realizzarla, e la creazione consuma quegli oggetti. Le ricette sono dati inseriti nel banco dall'Inspector, quindi per aggiungere una nuova ricetta non serve scrivere altro codice. L'inventario comunica ogni cambiamento a chiunque sia in ascolto e viene salvato come JSON ogni volta che cambia, così non perdi nulla quando esci dal gioco.

Scrivi due script: Inventory, sullo zaino, e CraftingBench, sul banco.

challenge icon

Sfida

Difficile

Inventory:

  • Una classe [System.Serializable] ItemStack con public string item e public int count, e una classe [System.Serializable] InventoryData con public List<ItemStack> stacks. L'inventario conserva un InventoryData.
  • public event Action Changed, attivato dopo ogni modifica.
  • public int Count(string item): quanti oggetti di quel tipo contiene, 0 se non ne contiene.
  • public void Add(string item, int amount) aggiunge alla pila dell'oggetto oppure aggiunge una nuova pila alla fine dell'elenco. public void Remove(string item, int amount) ne sottrae, e una pila che raggiunge 0 viene rimossa dall'elenco.
  • public string Describe() elenca le pile nell'ordine in cui compaiono, come Wood 3, Plank 1, oppure restituisce empty.
  • Ogni modifica viene salvata subito in inventory.json in Application.persistentDataPath, come JsonUtility.ToJson di InventoryData. Awake carica il file se esiste.

CraftingBench, a cui l'Inspector assegna inventory, recipes, recipeButtons (uno per ricetta, nello stesso ordine), woodButton, stoneButton e inventoryText:

  • Una classe [System.Serializable] Ingredient con public string item e public int amount, e una classe [System.Serializable] Recipe con public string result e public List<Ingredient> needs. recipes del banco è una List<Recipe>, compilata nella scena.
  • I pulsanti di raccolta aggiungono un'unità di Wood o un'unità di Stone. Ogni pulsante delle ricette chiama public void Craft(int index) con l'indice della propria ricetta.
  • Craft non fa nulla se nell'inventario manca qualcosa che serve per la ricetta. Altrimenti rimuove ogni ingrediente, aggiunge un'unità del risultato e lo registra, come Crafted Axe.
  • All'avvio e ogni volta che l'inventario cambia, ciascun pulsante delle ricette è cliccabile solo se è possibile creare la relativa ricetta, e inventoryText mostra la descrizione dopo la parola Inventory, come Inventory: Wood 3, Plank 1 oppure Inventory: empty.

Premi Play, raccogli materiali e crea una zattera, premi Stop e poi di nuovo Play, quindi Check.

Provalo tu

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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Architettura dei giochi in Unity