Menu
CoddyTech

Gegnerdaten

Lektion 2 von 18 im Kurs Unity-Spiel: Tower Defense von Coddy.

Ein Tower-Defense-Spiel hat verschiedene Arten von Gegnern: Fußsoldaten, schnelle Läufer und langsame Panzer. Jeder Fußsoldat läuft mit derselben Geschwindigkeit und startet mit derselben Gesundheit, daher gehören diese Werte zur Art und nicht zu einem einzelnen Gegner. Sie kommen in ein ScriptableObject-Asset, eines pro Art, und jeder Gegner dieser Art verweist darauf. Änderst du das Asset, ändern sich alle Gegner dieser Art mit.

Ein Asset darf nicht den Zustand eines einzelnen Gegners speichern. Ein Fußsoldat, der einen Treffer abbekommen hat, hat weniger Gesundheit als der Fußsoldat hinter ihm, daher speichert das Asset maxHealth, die Gesundheit, mit der ein Fußsoldat startet, und jeder Gegner kopiert diesen Wert in ein eigenes Feld. Ein Rennspiel teilt ein Auto auf dieselbe Weise auf:

[CreateAssetMenu(fileName = "NewCar", menuName = "Racing/Car Data")]
public class CarData : ScriptableObject
{
    public float topSpeed = 30f;
    public float tankSize = 50f;
}

public class Car : MonoBehaviour
{
    public CarData data;
    private float fuel;

    void Awake()
    {
        fuel = data.tankSize;
    }
}

Jedes Auto eines Modells teilt sich ein CarData, und jedes verbraucht sein eigenes fuel. Würdest du stattdessen data.tankSize -= used schreiben, würde der Tank aller Autos dieses Modells gleichzeitig geleert, und im Editor bliebe die Änderung nach dem Play-Modus im Asset erhalten. Awake wird ausgeführt, sobald das Objekt erstellt wird, sodass die Kopie bereit ist, bevor irgendetwas darauf zugreifen kann.

challenge icon

Aufgabe

Einfach

Ein Runner gesellt sich zum Grunt: schneller, aber mit weniger Gesundheit. Gib jeder Art ein eigenes Asset.

  1. Erstelle in EnemyData.cs EnemyData über das Create-Menü mit dem Menünamen Tower Defense/Enemy Data und füge die öffentlichen Felder speed (ein float), maxHealth und reward (ints) hinzu.
  2. Ersetze in Enemy.cs das Feld speed durch ein öffentliches Feld data vom Typ EnemyData, und bewege dich mit data.speed.
  3. Füge ein privates int-Feld health hinzu und setze es in Awake auf den Wert maxHealth des Assets.

Das Projekt hat ein GruntData-Asset (Geschwindigkeit 2, Gesundheit 9, Belohnung 5) und ein RunnerData-Asset (Geschwindigkeit 3.5, Gesundheit 5, Belohnung 3), und der Inspector weist jedem Gegner sein eigenes zu. Drücke Play und beobachte, wie der Runner den Grunt überholt, dann Check.

Probier es selbst

using UnityEngine;

// Kommt später: die Werte eines Gegnertyps als Asset.
public class EnemyData : ScriptableObject
{
}
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 Unity-Spiel: Tower Defense