Daten-Assets
Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 23 von 64.
In einem Farmspiel wachsen Karotten und Kürbisse. Eine Karotte wächst 30 Sekunden lang und wird für 5 Münzen verkauft, ein Kürbis wächst 90 Sekunden lang und wird für 40 verkauft. Diese Zahlen gehören zur Pflanze, nicht zu einer einzelnen Pflanze: Als Inspector-Felder in einem Plant-Skript enthält jede Karotte in jeder Szene eine eigene Kopie der Werte 30 und 5, und bei einer Änderung müssen alle gefunden werden. Ein ScriptableObject speichert solche Daten in einem Asset, einer Datei im Projekt, auf die beliebig viele Objekte verweisen können. Seine Klasse leitet sich von ScriptableObject statt von MonoBehaviour ab:
using UnityEngine;
[CreateAssetMenu(fileName = "NewPlant", menuName = "Farm/Plant Data")]
public class PlantData : ScriptableObject
{
public string plantName;
public float growTime;
public int sellPrice;
}[CreateAssetMenu] fügt die Klasse zum Menü „Create“ im Project-Fenster hinzu. Klicke mit der rechten Maustaste im Project-Fenster, wähle Create > Farm > Plant Data, und Unity erstellt ein Asset namens NewPlant; benenne es in Carrot um, wähle es aus und gib Carrot, 30 und 5 in die Felder im Inspector ein. Ein Pumpkin-Asset wird auf dieselbe Weise erstellt. Die Klasse kommt in eine Datei, die nach ihr benannt ist: PlantData.cs, wie auch bei einem MonoBehaviour.
Das Verhalten bleibt in einem MonoBehaviour mit einem Feld vom Typ des Assets. Ziehe das Carrot-Asset auf dieses Feld, und das Skript liest die Zahlen darüber aus:
public class Plant : MonoBehaviour
{
public PlantData data;
private float age;
void Update()
{
age += Time.deltaTime;
if (age >= data.growTime)
{
Debug.Log(data.plantName + " is ready, worth " + data.sellPrice);
enabled = false;
}
}
}Ein ScriptableObject befindet sich auf keinem GameObject und in keiner Szene. Es hat keinen Transform, und Unity ruft niemals seine Update- oder Start-Methode auf: Es speichert Daten, und das Plant enthält das Verhalten. Wenn 200 Karotten auf das eine Carrot-Asset verweisen, ändert eine Einstellung von growTime auf 25 den Wert für alle 200. Im Code wird eine Instanz mit ScriptableObject.CreateInstance<PlantData>() erstellt, niemals mit new.
Aufgabe
MittelVerschiebe die Einstellungen des Helden in ein Daten-Asset.
- Schreibe in
HeroData.cspublic class HeroData : ScriptableObjectmit den öffentlichen Feldernstring heroName,float moveSpeedundColor color. - Setze
[CreateAssetMenu(menuName = "Heroes/Hero Data")]in die Zeile darüber. - Ersetze in
Hero.csdie drei Felder durchpublic HeroData data;und lies stattdessendata.heroName,data.moveSpeedunddata.coloraus.
Drücke „Spielen“: Der rote Ritter läuft mit Geschwindigkeit 3. Drücke dann „Prüfen“.
Probier es selbst
using UnityEngine;
// HeroData: Name, Geschwindigkeit und Farbe des Helden als ScriptableObject
Alle Lektionen in Spielarchitektur in Unity
1Komponenten statt Hierarchien
Kleine KomponentenEin Basis-GegnerskriptAbstrakte KomponentenZusammenwirkende KomponentenRückblick: Modulares GeschützRückblick: Zwillingskanone4Serialisierte Daten
Serialisierbare KlassenListen im InspectorEnums im InspectorRückblick: Loot-TabelleRückblick: Beute auswürfeln2Schnittstellen in Unity
IDamageableSchnittstellen und TryGetComponentGetComponentsZusammenfassung: InteraktionstasteZusammenfassung: Nächstes in Reichweite5ScriptableObjects
Daten-AssetsWaffenwerteGemeinsame EinstellungenDen Wind speichernWellen als DatenRückblick: Item-DatenbankRückblick: Im Shop einkaufen8Wiederverwendbarer Code
ErweiterungsmethodenEin generisches SingletonGenerische HilfsmethodenRückblick: FindNearestÜbe selbstständig: Unity-Playground