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.
Aufgabe
SchwerSchreibe die Zustände des Golems in BossStates.cs.
ChaseState:Tint(Color.gray); gehe auf den Spieler zu mitspeed; wenn du innerhalb vonslamRangebist, bereite den Angriff vor.WindupState:Tint(Color.red); gib nachwindupTimeSlam!aus, füge einem Spieler in ReichweiteslamDamageSchaden zu und gehe in die Ruhephase.RestState:Tint(Color.cyan); gehe nachrestTimein die Verfolgung über.Boss.TakeDamagezählt nur inrest: ziehe den angegebenen Betrag ab, löseHealthChangedaus und rufe bei 0Fall()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;
}
}
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 Basis-GegnerskriptAbstrakte KomponentenZusammenwirkende KomponentenRückblick: Modulares GeschützRückblick: Zwillingskanone4Serialisierte Daten
Serialisierbare KlassenListen im InspectorEnums im InspectorRückblick: Loot-TabelleRückblick: Beute auswürfeln2Schnittstellen in Unity
IDamageableSchnittstellen und TryGetComponentGetComponentsZusammenfassung: InteraktionstasteZusammenfassung: Nächstes in Reichweite5ScriptableObjects
Daten-AssetsWaffenwerteGemeinsame EinstellungenDen Wind speichernWellen als DatenRückblick: Item-DatenbankRückblick: Im Shop einkaufen8Wiederverwendbarer Code
ErweiterungsmethodenEin generisches SingletonGenerische HilfsmethodenRückblick: FindNearestÜbe selbstständig: Unity-Playground