Menu
CoddyTech

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.

challenge icon

Desafio

Fácil

Faça o impulso do patinador consumir vigor.

  1. Em Stamina, adicione public bool TrySpend(float cost): se current for pelo menos cost, subtraia esse valor e retorne true; caso contrário, false.
  2. Coloque [RequireComponent(typeof(Stamina))] acima de public class Dash e obtenha o componente em um campo no método Awake().
  3. Ao pressionar Espaço, faça o impulso apenas se TrySpend(cost) for true; caso contrário, registre Too 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

Pratique por conta própria: Playground de Unity