Menu
CoddyTech

Bancada de Criação

Parte da seção Arquitetura de jogos no Unity do Journey de Unity da Coddy. Lição 49 de 50.

Em um jogo de sobrevivência, uma bancada de criação transforma o que você coleta em itens que pode usar. Dois botões coletam madeira e pedra, e três receitas as transformam em mais itens: duas madeiras fazem uma tábua, uma tábua e duas pedras fazem um machado, quatro tábuas fazem uma jangada. O botão de uma receita só pode ser pressionado enquanto o inventário tiver tudo de que a receita precisa, e a criação consome esses itens. As receitas são dados preenchidos na bancada pelo Inspector, então uma nova receita não precisa de código novo. O inventário anuncia cada alteração a quem estiver ouvindo, e é salvo como JSON cada vez que muda, então sair do jogo não faz nada se perder.

Escreva dois scripts: Inventory, no Backpack, e CraftingBench, na Bench.

challenge icon

Desafio

Difícil

Inventory:

  • Uma classe [System.Serializable] ItemStack com public string item e public int count, e uma classe [System.Serializable] InventoryData com public List<ItemStack> stacks. O inventário mantém um InventoryData.
  • public event Action Changed, acionado após cada alteração.
  • public int Count(string item): quantos itens há no inventário, 0 quando não houver nenhum.
  • public void Add(string item, int amount) adiciona à pilha do item ou adiciona uma nova pilha ao final da lista. public void Remove(string item, int amount) retira itens dela, e uma pilha que chega a 0 sai da lista.
  • public string Describe() lista as pilhas em ordem, como Wood 3, Plank 1, ou retorna empty.
  • Cada alteração é salva imediatamente em inventory.json em Application.persistentDataPath, como JsonUtility.ToJson do InventoryData. Awake carrega esse arquivo quando ele existe.

CraftingBench, ao qual o Inspector atribui inventory, recipes, recipeButtons (um por receita, na mesma ordem), woodButton, stoneButton e inventoryText:

  • Uma classe [System.Serializable] Ingredient com public string item e public int amount, e uma classe [System.Serializable] Recipe com public string result e public List<Ingredient> needs. O recipes da bancada é um List<Recipe>, preenchido na cena.
  • Os botões de coleta adicionam uma unidade de Wood ou uma unidade de Stone. Cada botão de receita chama public void Craft(int index) com o índice da receita correspondente.
  • Craft não faz nada quando falta no inventário algum item necessário para a receita. Caso contrário, remove cada ingrediente, adiciona uma unidade do resultado e registra isso, como Crafted Axe.
  • No início e sempre que o inventário mudar, cada botão de receita só fica clicável enquanto for possível fabricar a receita correspondente, e inventoryText mostra a descrição após a palavra Inventory, como Inventory: Wood 3, Plank 1 ou Inventory: empty.

Pressione Play, colete itens e fabrique uma jangada, pressione Stop e Play novamente e, em seguida, Check.

Experimente você mesmo

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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Arquitetura de jogos no Unity