Menu
CoddyTech

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.

challenge icon

Desafio

Fácil

A 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). Se current for pelo menos igual a cost, subtraia cost de current e retorne true; caso contrário, deixe current como está e retorne false.
  • 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, registra Too 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;
        }
    }
}
quiz iconTeste seus conhecimentos

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