Menu
CoddyTech

Établi de fabrication

Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 49 sur 50.

Dans un jeu de survie, un établi transforme ce que tu récoltes en objets utiles. Deux boutons permettent de ramasser du bois et de la pierre, et trois recettes les transforment en davantage d’objets : deux morceaux de bois donnent une planche, une planche et deux pierres donnent une hache, et quatre planches donnent un radeau. On ne peut appuyer sur le bouton d’une recette que lorsque l’inventaire contient tout ce dont elle a besoin, et fabriquer un objet consomme ces éléments. Les recettes sont des données renseignées sur l’établi dans l’Inspector, donc une nouvelle recette ne nécessite aucun nouveau code. L’inventaire annonce chaque changement à tous ceux qui l’écoutent, et il est enregistré au format JSON chaque fois qu’il change, donc quitter le jeu ne fait rien perdre.

Écris deux scripts : Inventory, sur le sac à dos, et CraftingBench, sur l’établi.

challenge icon

Défi

Difficile

Inventory :

  • Une classe [System.Serializable] ItemStack avec public string item et public int count, et une classe [System.Serializable] InventoryData avec public List<ItemStack> stacks. L’inventaire conserve un seul InventoryData.
  • public event Action Changed, déclenché après chaque modification.
  • public int Count(string item) : le nombre d’éléments de cet objet qu’il contient, ou 0 s’il n’en contient aucun.
  • public void Add(string item, int amount) ajoute à la pile de l’objet, ou ajoute une nouvelle pile à la fin de la liste. public void Remove(string item, int amount) en retire, et une pile qui atteint 0 quitte la liste.
  • public string Describe() énumère les piles dans l’ordre, sous la forme Wood 3, Plank 1, ou renvoie empty.
  • Chaque modification est immédiatement enregistrée dans inventory.json dans Application.persistentDataPath, sous la forme de JsonUtility.ToJson appliqué à InventoryData. Awake charge ce fichier s’il existe.

CraftingBench, auquel l’Inspector attribue inventory, recipes, recipeButtons (un par recette, dans le même ordre), woodButton, stoneButton et inventoryText :

  • Une classe [System.Serializable] Ingredient avec public string item et public int amount, et une classe [System.Serializable] Recipe avec public string result et public List<Ingredient> needs. Le recipes de l’établi est une List<Recipe>, remplie dans la scène.
  • Les boutons de collecte ajoutent un Wood ou un Stone. Chaque bouton de recette appelle public void Craft(int index) avec l’index de sa recette.
  • Craft ne fait rien si l’inventaire ne contient pas tous les éléments requis par la recette. Sinon, il retire chaque ingrédient, ajoute un exemplaire du résultat et l’affiche dans le journal, sous la forme Crafted Axe.
  • Au démarrage et chaque fois que l’inventaire change, chaque bouton de recette n’est cliquable que si sa recette peut être fabriquée, et inventoryText affiche la description après le mot Inventory, sous la forme Inventory: Wood 3, Plank 1 ou Inventory: empty.

Appuie sur Play, collecte des ressources et fabrique un radeau, appuie sur Stop puis de nouveau sur Play, puis sur Check.

Essayez vous-même

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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Architecture de jeu dans Unity