Menu
CoddyTech

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.

challenge icon

Aufgabe

Mittel

Verschiebe die Einstellungen des Helden in ein Daten-Asset.

  1. Schreibe in HeroData.cs public class HeroData : ScriptableObject mit den öffentlichen Feldern string heroName, float moveSpeed und Color color.
  2. Setze [CreateAssetMenu(menuName = "Heroes/Hero Data")] in die Zeile darüber.
  3. Ersetze in Hero.cs die drei Felder durch public HeroData data; und lies stattdessen data.heroName, data.moveSpeed und data.color aus.

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

Übe selbstständig: Unity-Playground