Scontro con il boss
Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 64 di 64.
Un golem di pietra sorveglia il cancello che conduce fuori dall'arena. Avanza verso di te pestando i piedi e, quando ti avvicini, solleva i pugni per un secondo e colpisce il terreno: se sei ancora nelle vicinanze, ti farà male. Dopo un colpo si riposa; solo allora la tua spada può ferirlo: la sua pelle di pietra respinge ogni colpo mentre cammina o si prepara a colpire. Il suo colore indica cosa sta facendo: grigio mentre cammina, rosso mentre si prepara a colpire, ciano mentre si riposa. Porta la sua salute a 0 e il cancello si apre. La barra nella parte superiore dello schermo si aggiorna a ogni colpo.
Scrivi il cervello del golem come una macchina a stati con una classe per ogni stato: Boss, e ChaseState, WindupState e RestState in BossStates.cs. Il giocatore, la barra della salute, il cancello, IState, StateMachine e IDamageable sono pronti, e Boss crea già i suoi stati e aggiorna la macchina a ogni tick.
Sfida
DifficileScrivi gli stati del golem in BossStates.cs.
ChaseState:Tint(Color.gray); avvicinati al giocatore aspeed; quando sei entroslamRange, preparati ad attaccare.WindupState:Tint(Color.red); dopowindupTime, registraSlam!, infliggislamDamagea un giocatore nel raggio d’azione e riposa.RestState:Tint(Color.cyan); doporestTime, insegui.Boss.TakeDamageconta i danni solo inrest: sottrai la quantità, attivaHealthChangede chiamaFall()quando la salute arriva a 0.
Premi «Gioca» e colpisci mentre riposa. Poi premi «Verifica».
Provalo tu
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)
{
// I colpi contano solo mentre riposa: sottrai amount, genera l'evento HealthChanged, chiama Fall() a 0
}
// Pronto: il golem cade, il cancello si apre e il golem lascia l'arena.
void Fall()
{
Debug.Log("The golem falls");
onDefeated.Invoke();
gameObject.SetActive(false);
}
// Quanto dista player sul piano orizzontale.
public float PlayerDistance()
{
Vector3 d = player.position - transform.position;
d.y = 0f;
return d.magnitude;
}
// Grigio mentre cammina, rosso mentre si prepara, ciano mentre riposa.
public void Tint(Color color)
{
GetComponent<Renderer>().material.color = color;
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Architettura dei giochi in Unity
1Componenti, non gerarchie
Componenti piccoliUno script base per i nemiciComponenti astrattiComponenti che collaboranoRipasso: torretta modulareRipasso: cannone doppio4Dati serializzati
Classi serializzabiliElenchi nell'InspectorEnum nell'InspectorRiepilogo: tabella del bottinoRiepilogo: tira il bottino2Interfacce in Unity
IDamageableInterfacce e TryGetComponentGetComponentsRiepilogo: tasto InteragisciRiepilogo: il più vicino a portata5ScriptableObjects
Asset di datiStatistiche delle armiImpostazioni condiviseSalva il ventoOnde come datiRiepilogo: database degli oggettiRiepilogo: comprare dal negozioEsercitati da solo: Playground Unity