Componenti che collaborano
Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 4 di 50.
Anche i componenti piccoli hanno bisogno l’uno dell’altro. Un Jetpack ha bisogno di Fuel sullo stesso oggetto, quindi trova Fuel una volta in Awake, lo mantiene 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é è presente il Jetpack. Unity lo verifica 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 giusto per 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 consumare 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
FacileLo scatto della pattinatrice è gratuito: premendo Spazio, la spinge in avanti di 3 unità (+z) ogni volta. Fai in modo che consumi stamina. Le frecce la fanno pattinare (Mover.cs, pronto), e Stamina.cs ripristina già current di regen al secondo, fino a max (100).
- In Stamina, aggiungi un metodo pubblico
bool TrySpend(float cost). Securrentè almeno pari acost, sottraecostdacurrente restituiscetrue; altrimenti lasciacurrentcom’è e restituiscefalse. - Fai in modo che Dash richieda una Stamina sul suo oggetto, così Unity ne aggiunge una ogni volta che viene aggiunto un Dash. Recuperala una sola volta, in Awake, e assegnala a un campo.
- Uno scatto costa
cost(nell’Inspector è impostato a 40). Premendo Spazio si scatta solo se TrySpend acconsente; altrimenti registraToo tired.
Premi Play e scatta finché non è troppo stanca, poi premi Check.
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;
}
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Architettura dei giochi in Unity
1Componenti, non gerarchie
Componenti piccoliUno script base per i nemiciComponenti astrattiComponenti che collaboranoRiepilogo: torretta modulare4Dati serializzati
Classi serializzabiliListe nell'InspectorEnum nell'InspectorRiepilogo: tabella del bottino7Macchine a stati
Gli stati come classiUna macchina a statiTransizioniIntelligenze dei nemiciRiepilogo: stati della porta10Progetto: Sopravvissuto nell’arena
L’eroeTipi di nemici5ScriptableObjects
Asset di datiStatistiche delle armiImpostazioni condiviseOndate come datiRiepilogo: database degli oggetti