Menu
CoddyTech

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.

challenge icon

Aufgabe

Schwer

Inventory:

  • Eine [System.Serializable]-Klasse ItemStack mit public string item und public int count sowie eine [System.Serializable]-Klasse InventoryData mit public List<ItemStack> stacks. Das Inventar speichert ein InventoryData-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, als Wood 3, Plank 1, oder gibt empty zurück.
  • Jede Änderung wird sofort in inventory.json unter Application.persistentDataPath als JsonUtility.ToJson des InventoryData-Objekts gespeichert. Awake lä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]-Klasse Ingredient mit public string item und public int amount sowie eine [System.Serializable]-Klasse Recipe mit public string result und public List<Ingredient> needs. recipes der Werkbank ist eine List<Recipe>, die in der Szene ausgefüllt wird.
  • Die Sammelbuttons fügen jeweils ein Wood oder ein Stone hinzu. Jeder Rezeptbutton ruft public void Craft(int index) mit dem Index seines Rezepts auf.
  • Craft unternimmt 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 als Crafted Axe.
  • Zu Beginn und immer dann, wenn sich das Inventar ändert, ist jeder Rezeptbutton nur dann anklickbar, wenn sein Rezept hergestellt werden kann. inventoryText zeigt die Beschreibung nach dem Wort Inventory an, zum Beispiel Inventory: Wood 3, Plank 1 oder Inventory: 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;
}
quiz iconTeste dich selbst

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