Menu
CoddyTech

Asset di dati

Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 19 di 50.

Un gioco agricolo coltiva carote e zucche. Una carota cresce per 30 secondi e viene venduta a 5 monete, mentre una zucca cresce per 90 secondi e viene venduta a 40. Questi numeri appartengono alla coltura, non a una singola pianta: se sono campi dell’Inspector in uno script Plant, ogni carota in ogni scena contiene una propria copia di 30 e 5, e per apportare una modifica bisogna trovarle tutte. Uno ScriptableObject conserva dati come questi in un asset, un file nel progetto a cui può fare riferimento un numero qualsiasi di oggetti. La sua classe deriva da ScriptableObject invece che da MonoBehaviour:

using UnityEngine;

[CreateAssetMenu(fileName = "NewPlant", menuName = "Farm/Plant Data")]
public class PlantData : ScriptableObject
{
    public string plantName;
    public float growTime;
    public int sellPrice;
}

[CreateAssetMenu] aggiunge la classe al menu Create della finestra Project. Fai clic con il tasto destro nella finestra Project, scegli Create > Farm > Plant Data e Unity crea un asset chiamato NewPlant; rinominalo Carrot, selezionalo e inserisci Carrot, 30 e 5 nei suoi campi nell’Inspector. Un asset Pumpkin si crea allo stesso modo. La classe va in un file che porta il suo nome, PlantData.cs, proprio come un MonoBehaviour.

Il comportamento rimane in un MonoBehaviour con un campo del tipo dell’asset. Trascina l’asset Carrot su quel campo e lo script leggerà i numeri tramite esso:

public class Plant : MonoBehaviour
{
    public PlantData data;
    private float age;

    void Update()
    {
        age += Time.deltaTime;
        if (age >= data.growTime)
        {
            Debug.Log(data.plantName + " is ready, worth " + data.sellPrice);
            enabled = false;
        }
    }
}

Uno ScriptableObject non si trova su alcun GameObject né in alcuna scena. Non ha un Transform e Unity non ne chiama mai Update o Start: contiene i dati, mentre Plant contiene il comportamento. Quando 200 carote fanno riferimento all’unico asset Carrot, impostare il suo growTime a 25 modifica tutte e 200. Nel codice, un’istanza si crea con ScriptableObject.CreateInstance<PlantData>(), mai con new.

challenge icon

Sfida

Medio

L’eroe si muove nell’arena con le frecce. Il suo nome, la velocità e il colore sono campi dello script Hero, e ogni nuovo eroe li copierebbe di nuovo. Spostali in una risorsa:

  • In HeroData.cs, scrivi HeroData, un ScriptableObject con i campi pubblici heroName (una stringa), moveSpeed (un float) e color (un Color). Aggiungi [CreateAssetMenu] con il nome del menu Heroes/Hero Data.
  • In Hero.cs, sostituisci i tre campi con un unico campo pubblico data di tipo HeroData e usa i valori della risorsa dove lo script usava i propri.

Il progetto contiene una risorsa Knight creata con quel menu (Knight, velocità 3, rosso) e l’Inspector la inserisce nel campo data dell’eroe. Premi Play e fai muovere Knight nell’arena, poi premi Check.

Provalo tu

using UnityEngine;

// HeroData: il nome, la velocità e il colore dell'eroe, come ScriptableObject
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