Menu
CoddyTech

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.

challenge icon

Sfida

Facile

Lo 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). Se current è almeno pari a cost, sottrae cost da current e restituisce true; altrimenti lascia current com’è e restituisce false.
  • 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 registra Too 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;
        }
    }
}
quiz iconMettiti alla prova

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