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.
Sfida
MedioSposta le impostazioni dell'eroe in una risorsa dati.
- In
HeroData.cs, scrivipublic class HeroData : ScriptableObjectconstring heroName,float moveSpeedeColor colorpubblici. - Inserisci
[CreateAssetMenu(menuName = "Heroes/Hero Data")]nella riga sopra. - In
Hero.cs, sostituisci i tre campi conpublic HeroData data;e leggi invecedata.heroName,data.moveSpeededata.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
1Componenti, non gerarchie
Componenti piccoliUno script base per i nemiciComponenti astrattiComponenti che collaboranoRipasso: torretta modulareRipasso: cannone doppio4Dati serializzati
Classi serializzabiliElenchi nell'InspectorEnum nell'InspectorRiepilogo: tabella del bottinoRiepilogo: tira il bottino2Interfacce in Unity
IDamageableInterfacce e TryGetComponentGetComponentsRiepilogo: tasto InteragisciRiepilogo: il più vicino a portata5ScriptableObjects
Asset di datiStatistiche delle armiImpostazioni condiviseSalva il ventoOnde come datiRiepilogo: database degli oggettiRiepilogo: comprare dal negozioEsercitati da solo: Playground Unity