Menu
CoddyTech

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.

challenge icon

Wyzwanie

Trudny

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

  • Boss implementuje IDamageable. W Awake ustawia zdrowie na maxHealth i tworzy StateMachine oraz jego trzy stany, przechowywane w polach publicznych machine, chase, windup i rest (każdy stan otrzymuje bossa w konstruktorze). W Start wywołuje HealthChanged z wartościami zdrowia i maxHealth, a następnie rozpoczyna od stanu chase; w każdej klatce wykonuje Tick maszyny.
  • ChaseState: zmienia kolor golema na Color.gray i prowadzi go po ziemi w stronę gracza z prędkością speed. Gdy gracz znajdzie się w zasięgu slamRange, przechodzi do stanu przygotowania ataku.
  • WindupState: zmienia jego kolor na Color.red i pozostaje nieruchomy przez windupTime sekund. Następnie wypisuje w konsoli Slam!, zadaje graczowi obrażenia slamDamage za pośrednictwem IDamageable, jeśli gracz nadal znajduje się w zasięgu slamRange, i przechodzi do stanu odpoczynku.
  • RestState: zmienia jego kolor na Color.cyan i czeka restTime sekund, po czym wraca do stanu pościgu. Każdy stan przygotowania ataku i każdy odpoczynek trwa pełny wyznaczony czas.
  • TakeDamage uwzględnia obrażenia tylko wtedy, gdy golem jest w stanie odpoczynku i nadal stoi: odejmuje zadaną wartość od zdrowia i wywołuje HealthChanged. Gdy zdrowie spadnie do 0, wypisuje w konsoli The golem falls, wywołuje onDefeated i 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;
    }
}
quiz iconSprawdź się

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