Menu
CoddyTech

Combate contra el jefe

Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 64 de 64.

Un gólem de piedra protege la salida de la arena. Avanza hacia ti dando pisotones y, cuando te acercas, levanta los puños durante un segundo y golpea el suelo; te hace daño si sigues cerca. Después de golpear el suelo, descansa, y solo entonces tu espada puede hacerle daño: su piel de piedra resiste todos los golpes mientras camina o se prepara para atacar. Su color indica lo que está haciendo: gris mientras camina, rojo mientras se prepara para atacar y cian mientras descansa. Reduce su salud a 0 y la puerta se abrirá. La barra de la parte superior de la pantalla registra cada golpe.

Escribe el cerebro del gólem como una máquina de estados, con una clase para cada estado: Boss y ChaseState, WindupState y RestState en BossStates.cs. El jugador, la barra de salud, la puerta, IState, StateMachine e IDamageable ya están listos, y Boss ya crea sus estados y actualiza la máquina.

challenge icon

Desafío

Difícil

Escribe los estados del gólem en BossStates.cs.

  1. ChaseState: Tint(Color.gray); avanza hacia el jugador a speed; al estar dentro de slamRange, prepárate para atacar.
  2. WindupState: Tint(Color.red); después de windupTime, registra Slam!, inflige a un jugador que esté dentro del alcance un daño de slamDamage y descansa.
  3. RestState: Tint(Color.cyan); después de restTime, persigue.
  4. Boss.TakeDamage solo cuenta durante rest: recibe la cantidad, activa HealthChanged y ejecuta Fall() cuando llegue a 0.

Pulsa «Jugar» y golpea mientras descansa. Después, pulsa «Comprobar».

Pruébalo tú mismo

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)
    {
        // Los golpes solo cuentan mientras descansa: resta amount, dispara HealthChanged y llama a Fall() al llegar a 0
    }

    // Listo: el gólem cae, la puerta se abre y el gólem abandona la arena.
    void Fall()
    {
        Debug.Log("The golem falls");
        onDefeated.Invoke();
        gameObject.SetActive(false);
    }

    // La distancia a la que está el jugador, medida sobre el suelo.
    public float PlayerDistance()
    {
        Vector3 d = player.position - transform.position;
        d.y = 0f;
        return d.magnitude;
    }

    // Gris mientras camina, rojo mientras se prepara, cian mientras descansa.
    public void Tint(Color color)
    {
        GetComponent<Renderer>().material.color = color;
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Arquitectura de juegos en Unity

Practica por tu cuenta: Playground de Unity