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.
Desafío
FácilHaz que el impulso del patinador consuma resistencia.
- En
Stamina, añadepublic bool TrySpend(float cost): sicurrentes al menoscost, réstalo y devuelvetrue; de lo contrario,false. - Coloca
[RequireComponent(typeof(Stamina))]encima depublic class Dashy asígnalo a un campo enAwake(). - Al pulsar Espacio, haz el impulso solo si
TrySpend(cost)estrue; de lo contrario, registraToo 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
1Componentes, no jerarquías
Componentes pequeñosUn script base para enemigosComponentes abstractosComponentes que trabajan juntosRepaso: torreta modularRepaso: cañón doble4Datos serializados
Clases serializablesListas en el InspectorEnumeraciones en el InspectorRepaso: tabla de botínRepaso: sortear el botín2Interfaces en Unity
IDamageableInterfaces y TryGetComponentGetComponentsRepaso: Tecla de interacciónRepaso: El más cercano al alcance5ScriptableObjects
Activos de datosEstadísticas de armasConfiguración compartidaGuardar el vientoOleadas como datosRepaso: base de datos de objetosRepaso: comprar en la tienda3Eventos
Eventos de C# en UnitySuscribirse en OnEnableCampos UnityEventLos eventos controlan la interfazRepaso: ventana emergente de logrosRepaso: temporizador de la ventana emergentePractica por tu cuenta: Playground de Unity