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 50.

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 pequeños métodos públicos:

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, ya sea en el Editor o con AddComponent, y no permite eliminar ese Fuel mientras el Jetpack siga ahí. Unity solo lo comprueba 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 propio objeto ya están ahí.

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

challenge icon

Desafío

Fácil

El impulso de la patinadora es gratis: al pulsar Espacio, la lanza 3 unidades hacia delante (+z). Haz que cueste resistencia. Las flechas la hacen patinar (Mover.cs, listo), y Stamina.cs ya recupera current a razón de regen por segundo, hasta max (100).

  • En Stamina, añade un método público bool TrySpend(float cost). Si current es al menos cost, resta cost a current y devuelve true; de lo contrario, deja current como está y devuelve false.
  • Haz que Dash necesite un componente Stamina en su objeto, para que Unity añada uno cada vez que se añade un componente Dash. Obtenlo una sola vez, en Awake, y guárdalo en un campo.
  • Un impulso cuesta cost (el Inspector establece 40). Al pulsar Espacio, la patinadora solo se impulsa si TrySpend lo permite; de lo contrario, registra Too tired.

Pulsa Play e impúlsala hasta que esté demasiado cansada; después, pulsa Check.

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;
        }
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Arquitectura de juegos en Unity