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.
Wyzwanie
TrudnyInventory:
- Klasa
[System.Serializable]ItemStackz polamipublic string itemipublic int countoraz klasa[System.Serializable]InventoryDataz polempublic List<ItemStack> stacks. Ekwipunek przechowuje jeden obiektInventoryData. 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 jakoWood 3, Plank 1, albo zwracaempty.- Każda zmiana jest od razu zapisywana w pliku
inventory.jsonwApplication.persistentDataPathjako wynikJsonUtility.ToJsondla obiektuInventoryData.Awakewczytuje 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]Ingredientz polamipublic string itemipublic int amountoraz klasa[System.Serializable]Recipez polamipublic string resultipublic List<Ingredient> needs.recipesobiektuCraftingBenchto listaList<Recipe>, wypełniana w scenie. - Przyciski zbierania dodają jedną sztukę
WoodlubStone. Każdy przycisk przepisu wywołujepublic void Craft(int index)z indeksem danego przepisu. Craftnic 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 jakoCrafted 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
inventoryTextwyświetla opis po słowie Inventory, na przykładInventory: Wood 3, Plank 1lubInventory: 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;
}
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
1Komponenty, nie hierarchie
Małe komponentyPodstawowy skrypt przeciwnikaKomponenty abstrakcyjneWspółpracujące komponentyPodsumowanie: modułowa wieżyczka4Dane serializowane
Klasy serializowalneListy w InspectorzeWyliczenia w InspectorzePodsumowanie: tabela łupów10Projekt: Arena przetrwania
BohaterTypy wrogów2Interfejsy w Unity
IDamageableInterfejsy i TryGetComponentGetComponentsPodsumowanie: klawisz interakcji5ScriptableObjects
Zasoby danychStatystyki broniWspółdzielone ustawieniaFale jako danePowtórka: baza danych przedmiotów8Kod wielokrotnego użytku
Metody rozszerzająceGeneryczny singletonGeneryczne metody pomocniczePodsumowanie: FindNearest