Supponiamo che tu stia creando un videogioco di ruolo e che tu abbia bisogno di un modo più semplice per assegnare statistiche, proprietà e molto altro a vari oggetti. Mentre è possibile utilizzare Unity prefabs per farlo e quindi modificare i valori di ogni singola copia del prefabbricato, questo è un modo scomodo per eseguire l’attività. Per cominciare, questo metodo consuma più della tua memoria, qualcosa che potrebbe essere necessario conservare se hai intenzione di fare un grande gioco. Inoltre, se è necessario apportare modifiche agli oggetti di gioco, semplicemente non è così efficiente farlo quando ci sono diverse copie di prefabbricati in giro. Questo diventa particolarmente un problema se hai un team più grande con cui lavorare, quindi ti consigliamo di rendere le cose più facili da cambiare per gli altri membri del team. Anche se non sei in una squadra, questo metodo sarebbe solo più difficile per te mentre lavori.
Per semplificare le cose in una situazione come questa, hai a disposizione Oggetti Scriptable. E quali sono gli oggetti Scriptable? In poche parole, sono contenitori di dati. Lo sviluppatore Unity crea un modello di base per questi contenitori, definendo le informazioni che ogni oggetto deve contenere. Quindi gli oggetti Scriptable vengono creati da quel modello, che vengono quindi utilizzati dagli oggetti di gioco Unity. Nell’esempio precedente, è possibile utilizzare un singolo oggetto Scriptable per definire quali sono le diverse proprietà di un elemento. Quindi l’oggetto Scriptable viene referenziato da tutte le copie dell’elemento. Prima se si desidera modificare le statistiche di un elemento, è necessario modificare i valori di ogni singola copia dell’elemento. Ora con gli oggetti Scriptable, devi solo cambiare un oggetto (l’oggetto Scriptable) e tutti gli oggetti che ricevono dati da quell’oggetto Scriptable cambiano contemporaneamente.
È sempre utile vedere queste cose in azione, creare un nuovo progetto. Questo progetto mostra gli oggetti Scriptable e come possono aiutarti. Il progetto consiste in tre oggetti di gioco pensati per rappresentare tre personaggi. Ogni carattere eredita alcuni valori da un oggetto Scriptable. Questi valori sono salute massima, attacco, difesa, velocità e un nome e un colore per il personaggio. Una semplice interfaccia utente visualizza questi valori in modo da poter vedere facilmente i risultati dell’applicazione di oggetti script. Ora che hai un obiettivo finale, è il momento di creare.
Configurazione del progetto
Supponendo che implementerai queste idee in un nuovo progetto, apri l’applicazione Unity Hub e crea un nuovo progetto come mostrato in Figura 1.
Figura 1: Creazione di un nuovo progetto
Nella finestra successiva, assegnare al progetto un nome a scelta e decidere il percorso del file. Mentre è possibile eseguire questo progetto in qualsiasi modello, questo esempio utilizza il modello di progetto 3D come mostrato in Figura 2. Si consiglia di utilizzare questo modello se si desidera seguire.
Figura 2: Impostazione del nome del progetto, del tipo e della posizione
Una volta creato il progetto, ti consigliamo di organizzarti. Nella finestra Risorse, è necessario creare tre cartelle facendo clic destro sulla finestra e la navigazione per Creare – > Cartella come mostrato in Figura 3 Denominare le cartelle Materiali, oggetti Scriptable, e script.
Figura 3: Creazione di una nuova cartella
Mentre sei qui, è una buona idea andare avanti e ottenere tre materiali realizzati. Questi materiali vengono utilizzati per modificare i colori di oggetti diversi in base al materiale specificato dall’Oggetto Scriptable. Per creare questi materiali, passare alla cartella Materiali e fare nuovamente clic con il pulsante destro del mouse, questa volta selezionando Crea -> Materiale. Quando si nomina il materiale, si consiglia di dargli un nome correlato al suo colore. Ad esempio, questo primo materiale può essere chiamato Rosso. Per impostare questo colore, è necessario selezionare il materiale appena creato e passare alla finestra di ispezione. Nel campo Albedo, c’è un selettore di colori mostrato in Figura 4 è possibile fare clic su per aprire il, bene, selettore di colori.
Figura 4: Apertura del selettore colore
Il colore viene modificato spostando il piccolo cerchio nel selettore colore o inserendo direttamente i valori RGB nella metà inferiore della finestra selettore colore. Nell’esempio precedente, i valori RGB sarebbero 255, 0, 0. Dopo questo, dovresti creare altri due materiali e assegnare i loro colori. Questo esempio utilizza il verde e il blu, ma possono essere di qualsiasi colore a tua scelta.
Ora arriva il momento di creare la scena reale in cui questo gioco si svolge. Si compone di due parti principali: c’è l’interfaccia utente che visualizza le statistiche fornite a vari oggetti scrivibili e le tre capsule che rappresentano i personaggi. I “personaggi” sono la parte più semplice, quindi puoi iniziare da lì. Tutto quello che dovete fare è andare alla finestra Gerarchia, fare clic sul pulsante Crea, e scegliere Oggetto 3D -> Capsula mostrato in Figura 5. Fallo tre volte o copia il primo oggetto, e puoi anche dare loro dei nomi se lo desideri. Questo esempio dà alle capsule i nomi Char1, Char2, Char3.
Figura 5: Creazione di un oggetto capsule
È necessario modificare le loro posizioni, in modo che non si sovrappongano. Per modificare la posizione dell’oggetto, selezionarne uno nella gerarchia e passare al componente Trasforma in Inspector. Quindi modificare i campi di posizionamento x, y e z per spostare gli oggetti dove si desidera.
Figura 6: Modifica della posizione dell’oggetto
La Tabella 1 mostra le posizioni esatte di tutte e tre le capsule in questo esempio.
Tabella 1: Tutti gli oggetti e le loro posizioni nel mondo
Oggetto |
Posizione X |
Posizione Y |
Posizione Z |
Char1 |
|||
Char2 |
|||
Char3 |
Naturalmente, sentitevi liberi di modificare uno qualsiasi di questi numeri, se si desidera. Il prossimo è l’interfaccia utente, che visualizza i valori dati agli oggetti script. Per iniziare, è necessario fare clic sul pulsante Crea della Gerarchia, ma questa volta scegliere UI- > Canvas. Quindi, con il nuovo oggetto Tela selezionato, fare nuovamente clic sul pulsante Crea e questa volta selezionare Crea Figlio vuoto. Infine, ancora una volta si fa clic sul pulsante Crea e questa volta scegliere UI -> Testo. Trascina l’oggetto di testo appena creato sull’oggetto di gioco vuoto e duplica il testo quattro volte usando Ctrl + D in modo che ci siano un totale di cinque oggetti di testo in GameObject. Una volta terminato, la gerarchia dovrebbe essere simile a quella in Figura 7.
Figura 7: La gerarchia corrente
Ogni oggetto di testo è correlata al nome e alle statistiche fornite tramite Oggetto Scriptable, ovvero salute massima, attacco, difesa e velocità. È utile modificare i nomi degli oggetti di testo con il valore che rappresenta. Quindi, il primo oggetto di testo può essere chiamato name_text e il secondo può essere chiamato attack_text e così via. Inoltre, è necessario modificare il testo predefinito per contribuire a fornire una visuale per come l’interfaccia utente appare. Questo viene fatto navigando verso il componente di testo in Inspector e cambiando il valore del testo. E infine, regolare le loro posizioni in modo che non siano tutti impilati uno sopra l’altro. Per semplificare, la Tabella 2 mostra tutti i diversi nomi di oggetti e quali dovrebbero essere i rispettivi valori.
Tabella 2: Tutti gli oggetti di testo e i loro valori di testo e posizionamento predefiniti
Rinominare GameObject (sotto Canvas) in qualcosa di un po ‘ più descrittivo, come Char1Description, quindi duplicare l’oggetto genitore. Rinominare i due duplicati in Char2Description e Char3Description e posizionare i tre oggetti, in modo che siano sopra gli oggetti della capsula. Questo esempio posiziona Char1Description in una posizione X di -300, Char2Descrption a 0 e Char3Position a 250. Tutti i valori di posizione Y e Z sono lasciati a 0.
È stata una strada un po ‘ lunga, ma la configurazione del progetto è completa! Ora arriva il momento di codificare e vedere come vengono creati gli oggetti Scriptable per quanto riguarda la programmazione. Nella finestra Risorse, accedere alla cartella Script e creare due nuovi script facendo clic con il pulsante destro del mouse e passando a Create -> C# Script. Questi script dovrebbero essere chiamati CharStats e LoadStats. Una volta creati, inizierai nello script CharStats, quindi fai doppio clic su questo script per aprire Visual Studio e iniziare con il processo di codifica.
Script CharStats
Per creare un oggetto Scriptable, è necessario prima aggiungere al menu Create
utilizzato per creare materiali e script. Per fare ciò, utilizzerai l’attributo CreateAssetMenu
e specificherai il nome file e la posizione predefiniti all’interno del menu. Inoltre, dovrai cambiare da quale classe CharStats
eredita. Per impostazione predefinita, ogni classe c# in un progetto Unity eredita da MonoBehaviour
, ma questo script deve invece ereditare da ScriptableObject
.
Si noti quando si imposta menuName
che viene utilizzato un carattere barra, che indica l’uso dei sottomenu. Se si voleva, si potrebbe rimuovere la barra e basta avere l’opzione Unità giocatore presente senza la necessità di navigare ulteriormente attraverso il menu Crea. In questo caso, il sottomenu è stato aggiunto principalmente per mostrare che è possibile organizzare gli oggetti scrivibili in base a ciò che si desidera. In questo caso, il menu è Crea -> Creazione del personaggio – > Unità giocatore. Se lo si desidera, in un altro oggetto Scriptable è possibile creare l’oggetto dallo stesso percorso ma con un’opzione di creazione diversa, ad esempio Item.
Essendo un oggetto Scriptable non è necessario il Start
predefinito e i metodi di aggiornamento, quindi è possibile eliminarli. Lo scopo principale di questo oggetto è quello di contenere i dati che vengono dati a un altro oggetto, ma vengono creati anche due metodi personalizzati per dimostrare come gli oggetti Scriptable possano fare di più che contenere i dati. Parlando di dati, il codice per la definizione di dati che questo oggetto contiene va come questo:
1
2
3
4
5
6
|
public string charName;
public int attacco;
public int difesa;
public int velocità;
pubblico int maxHealth;
Materiale pubblico newColor;
|
Come accennato in precedenza, ogni oggetto scriptable contiene un nome e alcuni valori per quattro diverse statistiche. Contiene anche informazioni sul nuovo colore del personaggio una volta applicato l’oggetto Scriptable. I valori per ciascuno sono definiti nell’editor Unity e, naturalmente, saranno diversi per ogni oggetto creato.
I due metodi sono mantenuti semplici. Si stampa semplicemente un messaggio sulla console di debug dicendo che il personaggio è stato caricato. Questo messaggio viene stampato nel metodo Start
dello script LoadStats
.
1
2
3
4
|
public void PrintMessage()
{
Debug.Log (“Il carattere” + charName + ” è stato caricato.”);
}
|
RandomizeStats
, il secondo metodo, fa esattamente come suggerisce il nome. Cambia i valori dell’oggetto Scriptable in un numero casuale compreso tra 1 e 20. In seguito, programmerai il progetto per aggiornare automaticamente l’interfaccia utente con i nuovi valori. Ma non è nemmeno la parte più interessante! I dati in un oggetto Scriptable sono persistenti, il che significa che rimarranno gli stessi per la sessione fino alla chiusura del gioco. Questo è particolarmente utile se si sta facendo un gioco che consiste di più scene dal momento che normalmente vecchi oggetti vengono eliminati, e quelli nuovi vengono ricaricati come una nuova scena viene aperta. Tuttavia, i dati oggetto Scriptable non vengono toccati nella transizione tra le scene. Inoltre, i dati rimangono gli stessi mentre si lavora nell’editor Unity fino a quando l’editor stesso non viene chiuso. Ciò significa che le modifiche apportate ai dati all’interno di oggetti Scriptable durante l’esecuzione del gioco dall’editor sono presenti una volta che si gioca di nuovo il gioco dall’editor, a condizione che non vengano apportate modifiche ai dati stessi.
Questo è tutto ciò che c’è nello script CharStats. Potrebbe sembrare piuttosto semplice, ma il progetto non è completo. Hai programmato la possibilità di creare oggetti script con i propri metodi e dati, ma i tuoi personaggi capsule non sanno nulla di questi oggetti. Per quanto li riguarda, gli Oggetti Scriptable non esistono. Per risolvere questo problema, è necessario aprire lo script LoadStats e codificarlo in modo che gli oggetti possano utilizzare i dati di un oggetto Scriptable per aggiornare l’interfaccia utente e cambiare il loro colore. Il codice dovrebbe essere simile alla Figura 8.
Figura 8: Script CharStats completo
Loadstats Script
Non preoccuparti di cambiare dove la classe eredita questo script. Il valore predefinito MonoBehaviour
è esattamente ciò che è necessario. Invece, includi una nuova istruzione using in alto.
1
|
utilizzando UnityEngine.UI;
|
Compreso questo consente di ottenere il testo dall’interfaccia utente e aggiornarli per visualizzare i valori trovati negli oggetti Scriptable. Ora, sulla classe stessa, a partire dalle variabili.
1
2
3
4
5
6
7
8
|
// scriptable object
public CharStats charStat;
public Text nameText;
public Text attackText;
public Text defenseText;
public Text speedText;
public Text maxHealthText;
public MeshRenderer currentColor;
|
Come notato nel commento ,la variabile charStat
è l’oggetto Scriptable che viene utilizzato. Puoi vedere qui che ottenere questi oggetti Scriptable non è diverso dal dichiarare qualsiasi altra variabile. Più avanti nello script, otterrete le variabili e i metodi all’interno dell’oggetto e li utilizzerete in questo script. In effetti, il metodo PrintMessage
trovato in CharStats
viene utilizzato in LoadStats
Start
metodo in questo momento.
1
2
3
4
5
|
void Start()
{
DisplayStats();
charStat.PrintMessage();
}
|
Come con qualsiasi altro script esterno, tutto ciò che devi fare è chiamare charStat
seguito da PrintMessage
per ottenere il metodo trovato in quell’oggetto Scriptable. Questo può rivelarsi particolarmente utile se si dispone di oggetti che hanno tutti comportamenti simili o identici. In questo caso, può anche essere utile allo sviluppatore, come in questo esempio, stampare i messaggi sulla console di debug. Se qualcosa dovesse andare storto e si sospettava che l’oggetto Scriptable fosse in errore, è possibile utilizzare i messaggi della console di debug per trovare il problema.
In questo momento, c’è un errore che dice che DisplayStats
non esiste. Per risolvere questo problema, navigare sotto il metodo Update
e aggiungere questo codice.
Ecco dove i valori memorizzati nell’oggetto Scriptable vengono riprodotti. Tutte quelle variabili di testo dichiarate in precedenza? Verranno dati dati da visualizzare, quindi quei punti interrogativi impostati nell’editor ora mostrano un valore. Inoltre, anche se non è davvero una statistica, di per sé, il colore del carattere viene modificato qui chiamando currentColor.material
e impostandolo sul materiale impostato nell’Oggetto Scriptable.
Il secondo metodo charStats
, RandomizeStats
, non ha ancora visto l’uso, quindi dovresti trovare un posto per questo. Nel metodo Update
, il programma controlla se la barra spaziatrice è stata premuta. Se lo ha, chiama RandomizeStats
e fornisce all’Oggetto Scriptable alcuni nuovi valori. Quindi DisplayStat
viene richiamato di nuovo e vengono visualizzati i nuovi valori.
1
2
3
4
5
6
7
8
|
void Update()
{
if (Input.GetKeyDown(codice chiave.Spazio))
{
charStat.RandomizeStats ();
DisplayStats();
}
}
|
Questo conclude lo script LoadStats
, terminando così la parte di codifica di questo progetto. Il codice dovrebbe essere simile alla Figura 9. Tutto ciò che resta da fare ora è creare alcuni oggetti Scriptable, applicarli all’oggetto capsule usando LoadStats
e provare questa nuova funzionalità. Naturalmente, assicurati di salvare il tuo lavoro prima di tornare all’editor Unity.
Figura 9: Completare lo script LoadStats
Completare il progetto
Per utilizzare gli oggetti Scriptable, è necessario prima crearli. Nella finestra Risorse, nella cartella Oggetti Scriptable, fare clic con il pulsante destro del mouse e passare a Crea -> Creazione del personaggio – > Unità giocatore come mostrato in Figura 10.
Figura 10: Creazione di una nuova unità Giocatore, un oggetto Scriptable
È possibile denominare l’oggetto quello che vuoi. L’esempio basa questi oggetti dalle tradizionali classi di giochi di ruolo, quindi avrà un guerriero, un cacciatore e un mago. Selezionare il nuovo oggetto, quindi passare alla finestra Inspector e assegnare valori ai diversi campi. Per compilare il nuovo campo Colore, basta passare alla cartella Materiali e fare clic e trascinare il materiale desiderato nel campo come mostrato in Figura 11.
Figura 11: Impostazione del nuovo materiale di colore dell’oggetto
Crea altri due oggetti Script e fai lo stesso di prima, dando loro valori diversi per i diversi campi. Una volta fatto ciò, passare alla finestra Gerarchia e selezionare uno degli oggetti char. Poi dare loro lo script LoadStats come componente navigando alla cartella Script nella finestra Risorse, trovare LoadStats, e trascinandolo nella finestra Inspector come mostrato in Figura 12.
Figura 12: Collegamento dello script LoadStats a un oggetto
Successivamente, è necessario compilare i campi LoadStats. Per iniziare, trova un oggetto Scriptable che desideri utilizzare sul tuo primo “carattere” e applicalo al campo Char Stat come mostrato in Figura 13. Ricordare che gli oggetti scriptable si trovano nella finestra Risorse sotto Oggetti Scriptable.
Figura 13: Impostazione in cui l’oggetto Scriptable Char1 è quello di ottenere dati
Ora compilare i campi di testo. Nella Gerarchia, espanderai l’area di disegno seguita dall’espansione dell’oggetto Descrizione carattere correlato a quello che stai modificando. Ad esempio, la modifica di Char1 significa che ti consigliamo di espandere Char1Description. Quindi prendere gli oggetti di testo trovati sotto l’oggetto genitore e applicarli ai campi corrispondenti come mostrato in Figura 14.
Figura 14: Impostazione di tutti i campi di testo
Una volta che i campi di testo sono stati riempiti, è sufficiente ottenere il Renderer Mesh dell’oggetto, in modo da avere accesso al materiale, consentendo così il cambiamento di colore. Tutto quello che dovete fare è fare clic e trascinare il componente Mesh Renderer nella finestra Inspector e trascinarlo nel campo Colore corrente come mostrato se Figura 15.
Figura 15: Impostando il campo Colore corrente
Ripeti i passaggi precedenti per gli altri due oggetti carattere e avrai terminato il progetto. Quando è pronto, fare clic sul pulsante Play nella parte superiore dell’editor e osservare come tre oggetti quasi identici hanno valori molto diversi ad essi collegati. Se per qualche motivo qualcosa non sembra giusto, il primo posto da controllare sarebbe i tuoi oggetti Scriptable e assicurati che i valori e i colori visualizzati siano quelli che volevi. Ricordati di ricontrollare anche il Nuovo campo Colore.
Tutti questi numeri e i loro colori provengono da Oggetti scrivibili, che a loro volta provengono da un singolo modello. Potresti creare anche più oggetti Script e collegarli al campo Char Stat nel componente Load Stats di un oggetto e avere un carattere molto diverso. Durante l’esecuzione del gioco (Figura 16), dovresti vedere un messaggio nella console di debug nell’angolo in basso a sinistra che indica che un personaggio è stato caricato. Ci sono altri due messaggi, ma puoi vedere solo un messaggio senza aprire la console di debug completa, trovata in Window -> General -> Console. Puoi anche premere la barra spaziatrice per ottenere statistiche completamente nuove per i tuoi personaggi. Se interrompi il gioco e lo riesegui, noterai che i valori generati casualmente persistono, dimostrando la persistenza degli oggetti scrivibili. Torneranno ai loro valori originali inserendo manualmente i valori negli oggetti o chiudendo e riaprendo l’editor.
Figura 16: Oggetti Scriptable in azione
Conclusione
Naturalmente, è possibile creare più tipi di oggetti Scriptable per molti tipi di oggetti. Questo esempio ha dimostrato il loro uso tramite classi di caratteri, ma c’è anche l’esempio di elementi di cui sopra. Può anche essere utilizzato per oggetti molto più piccoli, come power-up che ricordano quelli che si trovano nei giochi arcade. Utilizzando gli oggetti Scriptable, si crea un sistema semplice e pulito in cui è possibile modificare e caricare i dati con pochi tasti e vedere i risultati quasi istantaneamente. L’utilizzo di oggetti Scriptable significa anche meno script da creare, poiché è possibile utilizzare un modello per più oggetti. Indipendentemente dal fatto che il tuo progetto sia grande o piccolo, o se il tuo team abbia molti membri o solo te stesso, gli oggetti Scriptable possono rendere lo sviluppo di tutti un po ‘ più semplice.