Walka z bossem
Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 50 z 50.
Kamienny golem strzeże bramy prowadzącej poza arenę. Rusza w twoją stronę, a gdy się zbliżysz, na chwilę unosi pięści i uderza nimi o ziemię, raniąc cię, jeśli nadal jesteś w pobliżu. Po uderzeniu odpoczywa i dopiero wtedy twój miecz może go zranić: jego kamienna skóra z łatwością znosi każde uderzenie, gdy idzie lub przygotowuje się do ataku. Jego kolor pokazuje, co robi: szary, gdy idzie, czerwony, gdy przygotowuje się do ataku, cyjanowy, gdy odpoczywa. Zmniejsz jego zdrowie do 0, a brama się otworzy. Pasek u góry ekranu pokazuje każde uderzenie.
Napisz mózg golema jako maszynę stanów z klasą dla każdego stanu: Boss oraz ChaseState, WindupState i RestState w pliku BossStates.cs. Gracz, pasek zdrowia, brama, IState, StateMachine i IDamageable są już gotowe.
Wyzwanie
TrudnyW Inspectorze ustaw dla Boss wartości player, speed (2), slamRange (2.5), windupTime (1), restTime (2), slamDamage (2) i maxHealth (6), a także połącz jego UnityEvent onDefeated z metodą Open obiektu Gate. Metody PlayerDistance() i Tint(color) są gotowe.
BossimplementujeIDamageable. WAwakeustawia zdrowie namaxHealthi tworzyStateMachineoraz jego trzy stany, przechowywane w polach publicznychmachine,chase,windupirest(każdy stan otrzymuje bossa w konstruktorze). WStartwywołujeHealthChangedz wartościami zdrowia imaxHealth, a następnie rozpoczyna od stanuchase; w każdej klatce wykonuje Tick maszyny.ChaseState: zmienia kolor golema naColor.grayi prowadzi go po ziemi w stronę gracza z prędkościąspeed. Gdy gracz znajdzie się w zasięguslamRange, przechodzi do stanu przygotowania ataku.WindupState: zmienia jego kolor naColor.redi pozostaje nieruchomy przezwindupTimesekund. Następnie wypisuje w konsoliSlam!, zadaje graczowi obrażeniaslamDamageza pośrednictwemIDamageable, jeśli gracz nadal znajduje się w zasięguslamRange, i przechodzi do stanu odpoczynku.RestState: zmienia jego kolor naColor.cyani czekarestTimesekund, po czym wraca do stanu pościgu. Każdy stan przygotowania ataku i każdy odpoczynek trwa pełny wyznaczony czas.TakeDamageuwzględnia obrażenia tylko wtedy, gdy golem jest w stanie odpoczynku i nadal stoi: odejmuje zadaną wartość od zdrowia i wywołujeHealthChanged. Gdy zdrowie spadnie do 0, wypisuje w konsoliThe golem falls, wywołujeonDefeatedi dezaktywuje się.
Naciśnij Play, unikaj uderzeń i atakuj, gdy golem odpoczywa, a następnie naciśnij Check.
Spróbuj swoich sił
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;
// Odległość gracza mierzona po ziemi.
public float PlayerDistance()
{
Vector3 d = player.position - transform.position;
d.y = 0f;
return d.magnitude;
}
// Szary, gdy chodzi, czerwony, gdy przygotowuje atak, cyjanowy, gdy odpoczywa.
public void Tint(Color color)
{
GetComponent<Renderer>().material.color = color;
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Architektura gier w Unity
1Komponenty, nie hierarchie
Małe komponentyPodstawowy skrypt przeciwnikaKomponenty abstrakcyjneWspółpracujące komponentyPodsumowanie: modułowa wieżyczka4Dane serializowane
Klasy serializowalneListy w InspectorzeWyliczenia w InspectorzePodsumowanie: tabela łupów10Projekt: Arena przetrwania
BohaterTypy wrogów2Interfejsy w Unity
IDamageableInterfejsy i TryGetComponentGetComponentsPodsumowanie: klawisz interakcji5ScriptableObjects
Zasoby danychStatystyki broniWspółdzielone ustawieniaFale jako danePowtórka: baza danych przedmiotów8Kod wielokrotnego użytku
Metody rozszerzająceGeneryczny singletonGeneryczne metody pomocniczePodsumowanie: FindNearest