Menu
CoddyTech

Componentes que trabajan juntos

Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 4 de 64.

Los componentes pequeños también se necesitan entre sí. Un Jetpack necesita Fuel en el mismo objeto, así que busca Fuel una vez en Awake, lo guarda en un campo y se comunica con él mediante dos métodos públicos pequeños:

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))] hace que Unity añada un Fuel cada vez que se añade un Jetpack, en el Editor o con AddComponent, y se niega a quitar ese Fuel mientras el Jetpack esté allí. Unity lo comprueba solo en el momento en que se añade el Jetpack, así que un Jetpack que ya estaba en un objeto antes de que escribieras el atributo conserva su configuración anterior. Awake es el lugar para obtenerlo: se ejecuta una vez y, para entonces, todos los componentes del objeto ya están allí.

El Jetpack nunca cambia amount por sí mismo. Fuel decide qué significa quemar, por ejemplo, no bajar nunca de 0, y el Jetpack solo lo solicita. Si más adelante Fuel muestra un indicador o se recarga con objetos recogidos, el Jetpack no cambia.

challenge icon

Desafío

Fácil

Haz que el impulso del patinador consuma resistencia.

  1. En Stamina, añade public bool TrySpend(float cost): si current es al menos cost, réstalo y devuelve true; de lo contrario, false.
  2. Coloca [RequireComponent(typeof(Stamina))] encima de public class Dash y asígnalo a un campo en Awake().
  3. Al pulsar Espacio, haz el impulso solo si TrySpend(cost) es true; de lo contrario, registra Too tired.

Pulsa «Jugar»: después de dos impulsos, la Consola dice Too tired. Después, pulsa «Comprobar».

Pruébalo tú mismo

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 las lecciones de Arquitectura de juegos en Unity

Practica por tu cuenta: Playground de Unity