Menu
CoddyTech

Walka z bossem

Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 64 z 64.

Kamienny golem strzeże bramy prowadzącej poza arenę. Zbliża się do ciebie, a gdy podejdziesz blisko, na sekundę unosi pięści i uderza nimi o ziemię, zadając ci obrażenia, 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ą odpiera każde uderzenie, gdy chodzi lub przygotowuje się do ataku. Jego kolor pokazuje, co robi: szary, gdy chodzi, czerwony, gdy przygotowuje się do ataku, cyjanowy, gdy odpoczywa. Zmniejsz jego zdrowie do 0, a brama się otworzy. Pasek u góry ekranu odzwierciedla każde uderzenie.

Napisz mózg golema jako maszynę stanów z osobną 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, a Boss już tworzy swoje stany i wykonuje aktualizację maszyny.

challenge icon

Wyzwanie

Trudny

Napisz stany golema w pliku BossStates.cs.

  1. ChaseState: Tint(Color.gray); idź w stronę gracza z prędkością speed; gdy znajdziesz się w zasięgu slamRange, przygotuj się do ataku.
  2. WindupState: Tint(Color.red); po upływie windupTime wyświetl komunikat Slam!, zadaj obrażenia graczowi w zasięgu równe slamDamage, a następnie odpocznij.
  3. RestState: Tint(Color.cyan); po upływie restTime rusz w pościg.
  4. Boss.TakeDamage przyjmuje obrażenia tylko w stanie rest: odejmij otrzymaną wartość, wywołaj zdarzenie HealthChanged, a przy 0 wywołaj Fall().

Naciśnij „Graj” i atakuj, gdy golem odpoczywa. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

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)
    {
        // Uderzenia liczą się tylko podczas odpoczynku: odejmij amount, wywołaj HealthChanged, a przy 0 wywołaj Fall()
    }

    // Gotowe: golem upada, brama się otwiera, a golem opuszcza arenę.
    void Fall()
    {
        Debug.Log("The golem falls");
        onDefeated.Invoke();
        gameObject.SetActive(false);
    }

    // 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 szykuje się do ataku, 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

Poćwicz samodzielnie: Edytor online Unity