Werkbank
Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 49 von 50.
In einem Survival-Spiel verwandelt eine Werkbank Gesammeltes in Dinge, die du verwenden kannst. Zwei Schaltflächen sammeln Holz und Stein, und drei Rezepte verwandeln sie in mehr: Aus zwei Holz wird ein Brett, aus einem Brett und zwei Steinen wird eine Axt, aus vier Brettern wird ein Floß. Eine Rezept-Schaltfläche kann nur gedrückt werden, wenn das Inventar alles enthält, was das Rezept benötigt, und beim Herstellen werden diese Dinge verbraucht. Die Rezepte sind Daten, die an der Werkbank im Inspector eingetragen werden, sodass für ein neues Rezept kein neuer Code nötig ist. Das Inventar kündigt jede Änderung allen an, die darauf hören, und wird bei jeder Änderung als JSON gespeichert, sodass beim Beenden des Spiels nichts verloren geht.
Schreibe zwei Skripte: Inventory, auf dem Backpack, und CraftingBench, auf der Bench.
Aufgabe
SchwerInventory:
- Eine
[System.Serializable]-KlasseItemStackmitpublic string itemundpublic int countsowie eine[System.Serializable]-KlasseInventoryDatamitpublic List<ItemStack> stacks. Das Inventar speichert einInventoryData-Objekt. public event Action Changed, wird nach jeder Änderung ausgelöst.public int Count(string item): wie viele Exemplare des Gegenstands es enthält, 0, wenn es keine gibt.public void Add(string item, int amount)fügt dem Stapel des Gegenstands Exemplare hinzu oder fügt am Ende der Liste einen neuen Stapel hinzu.public void Remove(string item, int amount)entnimmt Exemplare daraus, und ein Stapel, der 0 erreicht, wird aus der Liste entfernt.public string Describe()listet die Stapel in ihrer Reihenfolge auf, alsWood 3, Plank 1, oder gibtemptyzurück.- Jede Änderung wird sofort in
inventory.jsonunterApplication.persistentDataPathalsJsonUtility.ToJsondesInventoryData-Objekts gespeichert.Awakelädt diese Datei, wenn sie vorhanden ist.
CraftingBench, dem der Inspector inventory, recipes, recipeButtons (einen pro Rezept, in derselben Reihenfolge), woodButton, stoneButton und inventoryText zuweist:
- Eine
[System.Serializable]-KlasseIngredientmitpublic string itemundpublic int amountsowie eine[System.Serializable]-KlasseRecipemitpublic string resultundpublic List<Ingredient> needs.recipesder Werkbank ist eineList<Recipe>, die in der Szene ausgefüllt wird. - Die Sammelbuttons fügen jeweils ein
Woododer einStonehinzu. Jeder Rezeptbutton ruftpublic void Craft(int index)mit dem Index seines Rezepts auf. Craftunternimmt nichts, wenn dem Inventar etwas fehlt, das das Rezept benötigt. Andernfalls entfernt es alle Zutaten, fügt ein Exemplar des Ergebnisses hinzu und protokolliert es, zum Beispiel alsCrafted Axe.- Zu Beginn und immer dann, wenn sich das Inventar ändert, ist jeder Rezeptbutton nur dann anklickbar, wenn sein Rezept hergestellt werden kann.
inventoryTextzeigt die Beschreibung nach dem Wort Inventory an, zum BeispielInventory: Wood 3, Plank 1oderInventory: empty.
Drücke Play, sammle Zutaten und stelle ein Floß her, drücke Stop und dann erneut Play, anschließend Check.
Probier es selbst
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;
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Spielarchitektur in Unity
1Komponenten statt Hierarchien
Kleine KomponentenEin Basisskript für GegnerAbstrakte KomponentenKomponenten im ZusammenspielRückblick: Modularer Geschützturm4Serialisierte Daten
Serialisierbare KlassenListen im InspectorEnums im InspectorRückblick: Loot-Tabelle7Zustandsautomaten
Zustände als KlassenEin ZustandsautomatÜbergängeGegner-KIWiederholung: Türzustände10Projekt: Arena-Überlebenskampf
Der HeldGegnertypen2Interfaces in Unity
IDamageableInterfaces und TryGetComponentGetComponentsRückblick: Interaktionstaste5ScriptableObjects
Daten-AssetsWaffenwerteGemeinsame EinstellungenWellen als DatenRückblick: Item-Datenbank8Wiederverwendbarer Code
ErweiterungsmethodenEin generisches SingletonGenerische HilfsmethodenRückblick: FindNearest