Componenti che collaborano
Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 4 di 64.
Anche i componenti piccoli hanno bisogno l’uno dell’altro. Un Jetpack ha bisogno di Fuel sullo stesso oggetto, quindi lo trova una volta in Awake, lo conserva in un campo e interagisce con esso tramite due piccoli metodi pubblici:
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))] fa sì che Unity aggiunga un Fuel ogni volta che viene aggiunto un Jetpack, nell’Editor o con AddComponent, e impedisce di rimuovere quel Fuel finché il Jetpack è presente. Unity lo controlla solo nel momento in cui viene aggiunto il Jetpack, quindi un Jetpack che era già su un oggetto prima che tu scrivessi l’attributo mantiene la configurazione precedente. Awake è il punto in cui recuperarlo: viene eseguito una volta e, a quel punto, tutti i componenti dell’oggetto sono già presenti.
Il Jetpack non modifica mai amount direttamente. Fuel decide cosa significa bruciare carburante, ad esempio non scendere mai sotto 0, e il Jetpack si limita a chiedere. Se in seguito Fuel mostra un indicatore o si ricarica raccogliendo oggetti, il Jetpack non cambia.
Sfida
FacileFai in modo che lo scatto del pattinatore consumi energia.
- In
Stamina, aggiungipublic bool TrySpend(float cost): securrentè almenocost, sottrai il costo e restituiscitrue, altrimentifalse. - Aggiungi
[RequireComponent(typeof(Stamina))]soprapublic class Dashe recupera il componente in un campo inAwake(). - Quando premi Spazio, esegui lo scatto solo se
TrySpend(cost)è true; altrimenti registraToo tired.
Premi «Gioca»: dopo due scatti, la Console dice Too tired. Poi premi «Verifica».
Provalo tu
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;
}
}
}
Tutte le lezioni di Architettura dei giochi in Unity
1Componenti, non gerarchie
Componenti piccoliUno script base per i nemiciComponenti astrattiComponenti che collaboranoRipasso: torretta modulareRipasso: cannone doppio4Dati serializzati
Classi serializzabiliElenchi nell'InspectorEnum nell'InspectorRiepilogo: tabella del bottinoRiepilogo: tira il bottino2Interfacce in Unity
IDamageableInterfacce e TryGetComponentGetComponentsRiepilogo: tasto InteragisciRiepilogo: il più vicino a portata5ScriptableObjects
Asset di datiStatistiche delle armiImpostazioni condiviseSalva il ventoOnde come datiRiepilogo: database degli oggettiRiepilogo: comprare dal negozioEsercitati da solo: Playground Unity