Menu
CoddyTech

Bosskampf

Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 64 von 64.

Ein Steingolem bewacht das Tor aus der Arena. Er stampft auf dich zu, und wenn du in seine Nähe kommst, hebt er für eine Sekunde die Fäuste und schlägt 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, solange 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 reagiert auf jeden Treffer.

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 bereit, und Boss erstellt bereits seine Zustände und lässt die Zustandsmaschine jeden Tick durchlaufen.

challenge icon

Aufgabe

Schwer

Schreibe die Zustände des Golems in BossStates.cs.

  1. ChaseState: Tint(Color.gray); gehe auf den Spieler zu mit speed; wenn du innerhalb von slamRange bist, bereite den Angriff vor.
  2. WindupState: Tint(Color.red); gib nach windupTime Slam! aus, füge einem Spieler in Reichweite slamDamage Schaden zu und gehe in die Ruhephase.
  3. RestState: Tint(Color.cyan); gehe nach restTime in die Verfolgung über.
  4. Boss.TakeDamage zählt nur in rest: ziehe den angegebenen Betrag ab, löse HealthChanged aus und rufe bei 0 Fall() auf.

Drücke „Spielen“ und greife an, während der Golem ruht. Drücke dann „Prüfen“.

Probier es selbst

using System;
using UnityEngine;
using UnityEngine.Events;

public class Boss : MonoBehaviour, IDamageable
{
    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;

    public StateMachine machine;
    public IState chase;
    public IState windup;
    public IState rest;

    private int health;

    void Awake()
    {
        health = maxHealth;
        machine = new StateMachine();
        chase = new ChaseState(this);
        windup = new WindupState(this);
        rest = new RestState(this);
    }

    void Start()
    {
        HealthChanged?.Invoke(health, maxHealth);
        machine.ChangeState(chase);
    }

    void Update()
    {
        machine.Tick();
    }

    public void TakeDamage(int amount)
    {
        // Treffer zählen nur, während er ruht: Ziehe amount ab, löse HealthChanged aus und rufe bei 0 Fall() auf
    }

    // Fertig: Der Golem fällt, das Tor öffnet sich und der Golem verlässt die Arena.
    void Fall()
    {
        Debug.Log("The golem falls");
        onDefeated.Invoke();
        gameObject.SetActive(false);
    }

    // Wie weit der Spieler über den 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 Schlag ausholt, und cyan, während er ruht.
    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

Übe selbstständig: Unity-Playground