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.
Desafío
FácilEl 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). Sicurrentes al menoscost, restacostacurrenty devuelvetrue; de lo contrario, dejacurrentcomo está y devuelvefalse. - 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, registraToo 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;
}
}
}
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
1Componentes, no jerarquías
Componentes pequeñosUn script base para enemigosComponentes abstractosComponentes que trabajan juntosRepaso: torreta modular4Datos serializados
Clases serializablesListas en el InspectorEnumeraciones en el InspectorRepaso: tabla de botín7Máquinas de estados
Estados como clasesUna máquina de estadosTransicionesCerebros de enemigosRepaso: estados de puertas10Proyecto: Superviviente de la arena
El héroeTipos de enemigos2Interfaces en Unity
IDamageableInterfaces y TryGetComponentGetComponentsRepaso: tecla de interacción5ScriptableObjects
Recursos de datosEstadísticas de armasConfiguración compartidaOleadas como datosRepaso: base de datos de objetos