Componentes trabalhando juntos
Parte da seção Arquitetura de jogos no Unity do Journey de Unity da Coddy. Lição 4 de 50.
Componentes pequenos ainda precisam uns dos outros. Um Jetpack precisa de Fuel no mesmo objeto, então encontra o Fuel uma vez em Awake, guarda-o em um campo e se comunica com ele por meio de dois métodos públicos pequenos:
public class Fuel : MonoBehaviour
{
public float amount = 10f;
public bool IsEmpty()
{
return amount <= 0f;
}
public void Burn(float units)
{
amount = Mathf.Max(amount - units, 0f);
}
}[RequireComponent(typeof(Fuel))]
public class Jetpack : MonoBehaviour
{
public float lift = 4f;
private Fuel fuel;
void Awake()
{
fuel = GetComponent<Fuel>();
}
void Update()
{
if (Keyboard.current.spaceKey.isPressed && !fuel.IsEmpty())
{
fuel.Burn(Time.deltaTime);
transform.position += Vector3.up * lift * Time.deltaTime;
}
}
}[RequireComponent(typeof(Fuel))] faz com que o Unity adicione um Fuel sempre que um Jetpack é adicionado, no Editor ou com AddComponent, e impede a remoção desse Fuel enquanto o Jetpack estiver lá. O Unity verifica isso somente no momento em que o Jetpack é adicionado, então um Jetpack que já estava em um objeto antes de você escrever o atributo mantém a configuração antiga. Awake é o lugar para buscá-lo: ele é executado uma vez, e até lá todos os componentes do próprio objeto já estão disponíveis.
O Jetpack nunca altera amount por conta própria. Fuel decide o que significa queimar, como nunca ficar abaixo de 0, e o Jetpack apenas faz a solicitação. Se mais tarde Fuel exibir um medidor ou for reabastecido por itens coletáveis, o Jetpack não precisará mudar.
Desafio
FácilA investida da patinadora é gratuita: a tecla Espaço a lança 3 unidades para a frente (+z) sempre que você a pressiona. Faça com que ela consuma vigor. As teclas de seta a movimentam (Mover.cs, pronto), e Stamina.cs já recupera current à taxa de regen por segundo, até max (100).
- Em Stamina, adicione um método público
bool TrySpend(float cost). Securrentfor pelo menos igual acost, subtraiacostdecurrente retornetrue; caso contrário, deixecurrentcomo está e retornefalse. - Faça com que Dash exija um componente Stamina em seu objeto, para que o Unity adicione um sempre que Dash for adicionado. Obtenha-o uma única vez, em Awake, e armazene-o em um campo.
- Uma investida custa
cost(o Inspector define o valor como 40). A tecla Espaço só executa a investida quando TrySpend autoriza; caso contrário, registraToo tired.
Pressione Play e execute investidas até ela ficar sem vigor; depois, pressione Check.
Experimente você mesmo
using UnityEngine;
using UnityEngine.InputSystem;
public class Dash : MonoBehaviour
{
public float distance = 3f;
public float cost = 40f;
void Update()
{
if (Keyboard.current.spaceKey.wasPressedThisFrame)
{
transform.position += Vector3.forward * distance;
}
}
}
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 para inimigosComponentes abstratosComponentes trabalhando juntosRevisão: Torre modular4Dados Serializados
Classes SerializáveisListas no InspectorEnums no InspectorRevisão: Tabela de Loot7Máquinas de Estados
Estados como ClassesUma Máquina de EstadosTransiçõesInteligências dos InimigosRevisão: Estados da Porta10Projeto: Sobrevivente da Arena
O HeróiTipos de Inimigos5ScriptableObjects
Assets de dadosAtributos das armasConfigurações compartilhadasOndas como dadosRevisão: banco de dados de itens