Menu
CoddyTech

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.

challenge icon

Aufgabe

Schwer

Der 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.

  • Boss implementiert IDamageable. In Awake setzt er seine Gesundheit auf maxHealth und erstellt eine StateMachine sowie ihre drei Zustände, die in den öffentlichen Feldern machine, chase, windup und rest gespeichert werden (jeder Zustand erhält den Boss in seinem Konstruktor). In Start löst er HealthChanged mit seiner Gesundheit und maxHealth aus und beginnt mit chase; in jedem Frame wird die Zustandsmaschine aktualisiert.
  • ChaseState: färbt den Golem mit Color.gray ein und lässt ihn mit speed am Boden entlang auf den Spieler zugehen. Sobald der Spieler innerhalb von slamRange ist, wechselt er in den Windup-Zustand.
  • WindupState: färbt ihn mit Color.red ein und lässt ihn für windupTime Sekunden stillstehen. Dann protokolliert er Slam!, fügt dem Spieler über dessen IDamageable slamDamage zu, falls der Spieler noch innerhalb von slamRange ist, und wechselt in den Ruhe-Zustand.
  • RestState: färbt ihn mit Color.cyan ein und wartet restTime Sekunden, bevor er zurück in den Verfolgungszustand wechselt. Jeder Windup und jede Ruhephase dauert die volle Zeit.
  • TakeDamage zählt nur, solange sich der Golem im Ruhezustand befindet und noch steht: Der angegebene Betrag wird von seiner Gesundheit abgezogen und HealthChanged ausgelöst. Bei 0 Gesundheit protokolliert er The golem falls, ruft onDefeated auf 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;
    }
}
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