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.
Desafio
DifícilEscreva os estados do golem em BossStates.cs.
ChaseState:Tint(Color.gray); caminhe em direção ao jogador aspeed; ao ficar dentro deslamRange, prepare o ataque.WindupState:Tint(Color.red); apóswindupTime, registreSlam!, cause dano a um jogador ao alcance usandoslamDamagee descanse.RestState:Tint(Color.cyan); apósrestTime, persiga.Boss.TakeDamagesó conta duranterest: receba a quantidade, dispareHealthChangede chameFall()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;
}
}
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
1Componentes, não hierarquias
Componentes pequenosUm script base de inimigoComponentes abstratosComponentes trabalhando juntosRevisão: torre modularRevisão: canhão duplo4Dados Serializados
Classes SerializáveisListas no InspectorEnums no InspectorRevisão: Tabela de LootRevisão: Sorteie o Loot2Interfaces no Unity
IDamageableInterfaces e TryGetComponentGetComponentsRevisão: tecla de interaçãoRevisão: mais próximo ao alcance5ScriptableObjects
Ativos de DadosAtributos da ArmaConfigurações CompartilhadasSalve o VentoOndas como DadosRevisão: Banco de ItensRevisão: Comprar na LojaPratique por conta própria: Playground de Unity