Bosskampf
Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 50 von 50.
Ein Steingolem bewacht das Tor aus der Arena. Er stapft auf dich zu, und wenn du näher kommst, hebt er eine Sekunde lang die Fäuste und schlägt dann auf den Boden, wodurch du verletzt wirst, wenn du noch in der Nähe bist. Nach einem Schlag ruht er sich aus, und erst dann kann dein Schwert ihm Schaden zufügen: Seine steinerne Haut steckt jeden Treffer weg, während er läuft oder zum Schlag ausholt. Seine Farbe zeigt, was er gerade tut: grau beim Laufen, rot beim Ausholen, cyanfarben beim Ausruhen. Bring seine Gesundheit auf 0, und das Tor öffnet sich. Die Leiste oben auf dem Bildschirm wird bei jedem Treffer aktualisiert.
Schreibe das Gehirn des Golems als Zustandsmaschine mit einer Klasse für jeden Zustand: Boss sowie ChaseState, WindupState und RestState in BossStates.cs. Der Spieler, die Gesundheitsleiste, das Tor, IState, StateMachine und IDamageable sind bereits vorbereitet.
Aufgabe
SchwerDer Inspector weist Boss player, speed (2), slamRange (2.5), windupTime (1), restTime (2), slamDamage (2) und maxHealth (6) zu und verbindet dessen UnityEvent onDefeated mit Open des Gates. PlayerDistance() und Tint(color) sind bereit.
BossimplementiertIDamageable. InAwakesetzt er seine Gesundheit aufmaxHealthund erstellt eineStateMachinesowie ihre drei Zustände, die in den öffentlichen Feldernmachine,chase,windupundrestgespeichert werden (jeder Zustand erhält den Boss in seinem Konstruktor). InStartlöst erHealthChangedmit seiner Gesundheit undmaxHealthaus und beginnt mitchase; in jedem Frame wird die Zustandsmaschine aktualisiert.ChaseState: färbt den Golem mitColor.grayein und lässt ihn mitspeedam Boden entlang auf den Spieler zugehen. Sobald der Spieler innerhalb vonslamRangeist, wechselt er in den Windup-Zustand.WindupState: färbt ihn mitColor.redein und lässt ihn fürwindupTimeSekunden stillstehen. Dann protokolliert erSlam!, fügt dem Spieler über dessenIDamageableslamDamagezu, falls der Spieler noch innerhalb vonslamRangeist, und wechselt in den Ruhe-Zustand.RestState: färbt ihn mitColor.cyanein und wartetrestTimeSekunden, bevor er zurück in den Verfolgungszustand wechselt. Jeder Windup und jede Ruhephase dauert die volle Zeit.TakeDamagezählt nur, solange sich der Golem im Ruhezustand befindet und noch steht: Der angegebene Betrag wird von seiner Gesundheit abgezogen undHealthChangedausgelöst. Bei 0 Gesundheit protokolliert erThe golem falls, ruftonDefeatedauf und deaktiviert sich.
Drücke Play, weiche den Schlägen aus und greife an, während er ruht, dann drücke Check.
Probier es selbst
using System;
using UnityEngine;
using UnityEngine.Events;
public class Boss : MonoBehaviour
{
public Transform player;
public float speed = 2f;
public float slamRange = 2.5f;
public float windupTime = 1f;
public float restTime = 2f;
public int slamDamage = 2;
public int maxHealth = 6;
public event Action<int, int> HealthChanged;
public UnityEvent onDefeated;
// Wie weit der Spieler am Boden entfernt ist.
public float PlayerDistance()
{
Vector3 d = player.position - transform.position;
d.y = 0f;
return d.magnitude;
}
// Grau, während er läuft, rot, während er zum Angriff ausholt, und cyan, während er sich ausruht.
public void Tint(Color color)
{
GetComponent<Renderer>().material.color = color;
}
}
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