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.
Desafío
DifícilEscribe los estados del gólem en BossStates.cs.
ChaseState:Tint(Color.gray); avanza hacia el jugador aspeed; al estar dentro deslamRange, prepárate para atacar.WindupState:Tint(Color.red); después dewindupTime, registraSlam!, inflige a un jugador que esté dentro del alcance un daño deslamDamagey descansa.RestState:Tint(Color.cyan); después derestTime, persigue.Boss.TakeDamagesolo cuenta duranterest: recibe la cantidad, activaHealthChangedy ejecutaFall()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;
}
}
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
1Componentes, no jerarquías
Componentes pequeñosUn script base para enemigosComponentes abstractosComponentes que trabajan juntosRepaso: torreta modularRepaso: cañón doble4Datos serializados
Clases serializablesListas en el InspectorEnumeraciones en el InspectorRepaso: tabla de botínRepaso: sortear el botín2Interfaces en Unity
IDamageableInterfaces y TryGetComponentGetComponentsRepaso: Tecla de interacciónRepaso: El más cercano al alcance5ScriptableObjects
Activos de datosEstadísticas de armasConfiguración compartidaGuardar el vientoOleadas como datosRepaso: base de datos de objetosRepaso: comprar en la tienda8Código reutilizable
Métodos de extensiónUn singleton genéricoFunciones auxiliares genéricasRepaso: FindNearest11Desafíos finales
Defensa de torres básicaMesa de fabricaciónRecetas de fabricaciónCombate contra el jefe3Eventos
Eventos de C# en UnitySuscribirse en OnEnableCampos UnityEventLos eventos controlan la interfazRepaso: ventana emergente de logrosRepaso: temporizador de la ventana emergentePractica por tu cuenta: Playground de Unity