Menu
CoddyTech

Luta contra o Chefe

Parte da seção Arquitetura de Jogos no Unity do Journey de Unity da Coddy. Lição 64 de 64.

Um golem de pedra guarda o portão que leva para fora da arena. Ele avança em sua direção e, quando você chega perto, ergue os punhos por um segundo e golpeia o chão, causando dano se você ainda estiver por perto. Depois de um golpe, ele descansa, e só então sua espada pode feri-lo: sua pele de pedra resiste a todos os golpes enquanto ele caminha ou se prepara para atacar. A cor indica o que ele está fazendo: cinza enquanto caminha, vermelho enquanto se prepara para atacar e ciano enquanto descansa. Reduza a vida dele a 0 e o portão se abrirá. A barra no topo da tela acompanha cada golpe.

Escreva o cérebro do golem como uma máquina de estados, com uma classe para cada estado: Boss e ChaseState, WindupState e RestState em BossStates.cs. O jogador, a barra de vida, o portão, IState, StateMachine e IDamageable já estão prontos, e Boss já cria seus estados e atualiza a máquina.

challenge icon

Desafio

Difícil

Escreva os estados do golem em BossStates.cs.

  1. ChaseState: Tint(Color.gray); caminhe em direção ao jogador a speed; ao ficar dentro de slamRange, prepare o ataque.
  2. WindupState: Tint(Color.red); após windupTime, registre Slam!, cause dano a um jogador ao alcance usando slamDamage e descanse.
  3. RestState: Tint(Color.cyan); após restTime, persiga.
  4. Boss.TakeDamage só conta durante rest: receba a quantidade, dispare HealthChanged e chame Fall() quando chegar a 0.

Pressione “Jogar” e ataque enquanto ele descansa. Em seguida, clique em “Verificar”.

Experimente você mesmo

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)
    {
        // Os golpes só contam enquanto ele descansa: aplique o dano indicado por amount, dispare HealthChanged e chame Fall() quando a vida chegar a 0
    }

    // Pronto: o golem cai, o portão se abre e o golem deixa a arena.
    void Fall()
    {
        Debug.Log("The golem falls");
        onDefeated.Invoke();
        gameObject.SetActive(false);
    }

    // A distância até o jogador, medida pelo chão.
    public float PlayerDistance()
    {
        Vector3 d = player.position - transform.position;
        d.y = 0f;
        return d.magnitude;
    }

    // Cinza enquanto ele anda, vermelho enquanto prepara o ataque, ciano enquanto descansa.
    public void Tint(Color color)
    {
        GetComponent<Renderer>().material.color = color;
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Arquitetura de Jogos no Unity

Pratique por conta própria: Playground de Unity