Menu
CoddyTech

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.

challenge icon

Sfida

Facile

Fai in modo che lo scatto del pattinatore consumi energia.

  1. In Stamina, aggiungi public bool TrySpend(float cost): se current è almeno cost, sottrai il costo e restituisci true, altrimenti false.
  2. Aggiungi [RequireComponent(typeof(Stamina))] sopra public class Dash e recupera il componente in un campo in Awake().
  3. Quando premi Spazio, esegui lo scatto solo se TrySpend(cost) è true; altrimenti registra Too 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

Esercitati da solo: Playground Unity