Menu
CoddyTech

Asset di dati

Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 23 di 64.

Un gioco agricolo coltiva carote e zucche. Una carota cresce per 30 secondi e si vende a 5 monete, una zucca cresce per 90 secondi e si vende a 40. Questi numeri appartengono alla coltura, non a una singola pianta: come campi 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. Un 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. Come per un MonoBehaviour, la classe va inserita in un file che porta il suo nome, PlantData.cs.

Il comportamento rimane in un MonoBehaviour con un campo del tipo dell'asset. Trascina l'asset Carrot su quel campo e lo script legge 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 chiama mai il suo Update o Start: contiene i dati, mentre Plant contiene il comportamento. Quando 200 carote fanno riferimento all'unico asset Carrot, impostando growTime a 25 il valore cambia per tutte e 200. Nel codice, un'istanza si crea con ScriptableObject.CreateInstance<PlantData>(), mai con new.

challenge icon

Sfida

Medio

Sposta le impostazioni dell'eroe in una risorsa dati.

  1. In HeroData.cs, scrivi public class HeroData : ScriptableObject con string heroName, float moveSpeed e Color color pubblici.
  2. Inserisci [CreateAssetMenu(menuName = "Heroes/Hero Data")] nella riga sopra.
  3. In Hero.cs, sostituisci i tre campi con public HeroData data; e leggi invece data.heroName, data.moveSpeed e data.color.

Premi «Gioca»: il Cavaliere rosso cammina a velocità 3. Poi premi «Verifica».

Provalo tu

using UnityEngine;

// HeroData: il nome, la velocità e il colore dell'eroe, come ScriptableObject

Tutte le lezioni di Architettura dei giochi in Unity

Esercitati da solo: Playground Unity