Componentes trabalhando juntos
Parte da seção Arquitetura de Jogos no Unity do Journey de Unity da Coddy. Lição 4 de 64.
Componentes pequenos ainda precisam uns dos outros. Um Jetpack precisa de Fuel no mesmo objeto, então ele 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 a Unity adicionar um Fuel sempre que um Jetpack é adicionado, no Editor ou com AddComponent, e impede a remoção desse Fuel enquanto o Jetpack estiver no objeto. A Unity verifica isso apenas 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 combustível, como nunca deixar o valor cair abaixo de 0, e o Jetpack apenas faz a solicitação. Se Fuel depois exibir um medidor ou for reabastecido com itens coletáveis, o Jetpack não precisará mudar.
Desafio
FácilFaça o impulso do patinador consumir vigor.
- Em
Stamina, adicionepublic bool TrySpend(float cost): securrentfor pelo menoscost, subtraia esse valor e retornetrue; caso contrário,false. - Coloque
[RequireComponent(typeof(Stamina))]acima depublic class Dashe obtenha o componente em um campo no métodoAwake(). - Ao pressionar Espaço, faça o impulso apenas se
TrySpend(cost)fortrue; caso contrário, registreToo tired.
Pressione “Jogar”: depois de dois impulsos, o Console exibirá Too tired. Em seguida, pressione “Verificar”.
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;
}
}
}
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