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.
Sfida
MedioL’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, scriviHeroData, un ScriptableObject con i campi pubbliciheroName(una stringa),moveSpeed(un float) ecolor(un Color). Aggiungi[CreateAssetMenu]con il nome del menuHeroes/Hero Data. - In
Hero.cs, sostituisci i tre campi con un unico campo pubblicodatadi 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
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
1Componenti, non gerarchie
Componenti piccoliUno script base per i nemiciComponenti astrattiComponenti che collaboranoRiepilogo: torretta modulare4Dati serializzati
Classi serializzabiliListe nell'InspectorEnum nell'InspectorRiepilogo: tabella del bottino7Macchine a stati
Gli stati come classiUna macchina a statiTransizioniIntelligenze dei nemiciRiepilogo: stati della porta10Progetto: Sopravvissuto nell’arena
L’eroeTipi di nemici5ScriptableObjects
Asset di datiStatistiche delle armiImpostazioni condiviseOndate come datiRiepilogo: database degli oggetti