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.
Desafio
DifícilInventory:
- Uma classe
[System.Serializable]ItemStackcompublic string itemepublic int count, e uma classe[System.Serializable]InventoryDatacompublic List<ItemStack> stacks. O inventário mantém umInventoryData. 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, comoWood 3, Plank 1, ou retornaempty.- Cada alteração é salva imediatamente em
inventory.jsonemApplication.persistentDataPath, comoJsonUtility.ToJsondoInventoryData.Awakecarrega 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]Ingredientcompublic string itemepublic int amount, e uma classe[System.Serializable]Recipecompublic string resultepublic List<Ingredient> needs. Orecipesda bancada é umList<Recipe>, preenchido na cena. - Os botões de coleta adicionam uma unidade de
Woodou uma unidade deStone. Cada botão de receita chamapublic void Craft(int index)com o índice da receita correspondente. Craftnã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, comoCrafted 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
inventoryTextmostra a descrição após a palavra Inventory, comoInventory: Wood 3, Plank 1ouInventory: 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;
}
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
1Componentes, não hierarquias
Componentes pequenosUm script-base para inimigosComponentes abstratosComponentes trabalhando juntosRevisão: Torre modular4Dados Serializados
Classes SerializáveisListas no InspectorEnums no InspectorRevisão: Tabela de Loot7Máquinas de Estados
Estados como ClassesUma Máquina de EstadosTransiçõesInteligências dos InimigosRevisão: Estados da Porta10Projeto: Sobrevivente da Arena
O HeróiTipos de Inimigos5ScriptableObjects
Assets de dadosAtributos das armasConfigurações compartilhadasOndas como dadosRevisão: banco de dados de itens