Menu
CoddyTech

Stół rzemieślniczy

Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 49 z 50.

W grze survivalowej stół rzemieślniczy zmienia zebrane przedmioty w rzeczy, których możesz używać. Dwa przyciski pozwalają zebrać drewno i kamień, a trzy przepisy pozwalają wytworzyć z nich kolejne przedmioty: z dwóch sztuk drewna powstaje deska, z deski i dwóch sztuk kamienia — siekiera, a z czterech desek — tratwa. Przycisku przepisu można użyć tylko wtedy, gdy w ekwipunku znajdują się wszystkie potrzebne do niego przedmioty, a wytwarzanie je zużywa. Przepisy to dane uzupełniane przy stole w Inspectorze, więc dodanie nowego przepisu nie wymaga nowego kodu. Ekwipunek informuje o każdej zmianie wszystkich nasłuchujących, a jego stan jest zapisywany jako JSON za każdym razem, gdy ulega zmianie, więc wyjście z gry nie powoduje utraty postępów.

Napisz dwa skrypty: Inventory przypisany do plecaka oraz CraftingBench przypisany do stołu.

challenge icon

Wyzwanie

Trudny

Inventory:

  • Klasa [System.Serializable] ItemStack z polami public string item i public int count oraz klasa [System.Serializable] InventoryData z polem public List<ItemStack> stacks. Ekwipunek przechowuje jeden obiekt InventoryData.
  • public event Action Changed, wywoływane po każdej zmianie.
  • public int Count(string item): ile sztuk danego przedmiotu zawiera ekwipunek; zwraca 0, gdy nie ma żadnej.
  • public void Add(string item, int amount) dodaje przedmioty do stosu danego przedmiotu lub dodaje nowy stos na końcu listy. public void Remove(string item, int amount) odejmuje przedmioty od stosu, a stos, którego liczba sztuk spadnie do 0, jest usuwany z listy.
  • public string Describe() wyświetla stosy w kolejności, na przykład jako Wood 3, Plank 1, albo zwraca empty.
  • Każda zmiana jest od razu zapisywana w pliku inventory.json w Application.persistentDataPath jako wynik JsonUtility.ToJson dla obiektu InventoryData. Awake wczytuje ten plik, jeśli istnieje.

CraftingBench, któremu Inspector przypisuje inventory, recipes, recipeButtons (po jednym przycisku na przepis, w tej samej kolejności), woodButton, stoneButton i inventoryText:

  • Klasa [System.Serializable] Ingredient z polami public string item i public int amount oraz klasa [System.Serializable] Recipe z polami public string result i public List<Ingredient> needs. recipes obiektu CraftingBench to lista List<Recipe>, wypełniana w scenie.
  • Przyciski zbierania dodają jedną sztukę Wood lub Stone. Każdy przycisk przepisu wywołuje public void Craft(int index) z indeksem danego przepisu.
  • Craft nic nie robi, jeśli w ekwipunku brakuje któregokolwiek składnika wymaganego przez przepis. W przeciwnym razie usuwa wszystkie składniki, dodaje jedną sztukę rezultatu i zapisuje go w logu jako Crafted Axe.
  • Na początku oraz przy każdej zmianie ekwipunku każdy przycisk przepisu jest aktywny tylko wtedy, gdy można wykonać dany przepis, a inventoryText wyświetla opis po słowie Inventory, na przykład Inventory: Wood 3, Plank 1 lub Inventory: empty.

Naciśnij Play, zbierz materiały i wytwórz tratwę, naciśnij Stop, a następnie ponownie Play, po czym naciśnij Check.

Spróbuj swoich sił

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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Architektura gier w Unity