Spesso l’hardcoding dei percorsi degli eventi nel codice non è la soluzione migliore per avere una panoramica degli eventi esistenti nel gioco. Per esempio, se spostiamo o rinominiamo un evento in FMOD Studio, anche il percorso dell’evento nel codice deve essere aggiornato. Questo processo richiede un po’ di tempo che possiamo diminuire se organizziamo i nostri eventi con l’aiuto degli ScriptableObjects.
Scarica il progetto Unity & FMOD per questo tutorial.
Cosa sono gli ScriptableObjects?
Gli ScriptableObjects vengono utilizzati per memorizzare informazioni e dati. Sono molto utili per memorizzare configurazioni generali del gioco.
Da un punto di vista tecnico gli ScriptableObjects, così come i MonoBehaviours, ereditano da UnityEngine.Object. Possiamo definire metodi o utilizzare alcuni callback di Unity: Awake(), OnDestroy(), OnEnable() e OnDisable(). Ma non c’è un metodo Update() per esempio. A differenza di MonoBehaviours, gli ScriptableObjects non sono serializzati nella scena (o prefabbricati) e non sono usati come componenti di GameObjects. Al contrario, vengono memorizzati come risorse nelle cartelle del progetto, proprio come le texture, i modelli 3D e gli script.
Preparazione per la creazione di ScriptableObjects
Creiamo uno script che elenca gli eventi sotto forma di stringhe per un ipotetico giocatore. Questo ci permette di creare successivamente un file .asset che possiamo utilizzare all’interno di altri script per accedere ai percorsi degli eventi:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(menuName = "SO/Audio/Player", fileName = "New Player Sheet")]
public class PlayerAudioData : ScriptableObject
{
[Header("Movement")]
[FMODUnity.EventRef]
public string footsteps = null;
[FMODUnity.EventRef]
public string jump = null;
[FMODUnity.EventRef]
public string dash = null;
[FMODUnity.EventRef]
public string land = null;
[Header("Attacks")]
[FMODUnity.EventRef]
public string[] swordAttacks = null;
[FMODUnity.EventRef]
public string hammerAttack = null;
[FMODUnity.EventRef]
public string shield = null;
}
Come si vede, lo script non eredita da MonoBehaviour, ma da ScriptableObject. Questo significa che non possiamo usare questo ScriptableObject direttamente come component all’interno di un GameObject. Invece, possiamo usare usare il menu di Unity per creare un file .asset che contiene tutti i dati che abbiamo definito:
Unity genererà quindi un nuovo file .asset chiamato New Player Sheet (che ovviamente possiamo cambiare nello script precedentemente creato). Rinominiamo il file in qualcosa come PlayerAudio. Cliccando sul file vediamo nell’inspector dei campi vuoti che possiamo riempire con degli eventi da noi creati:
Riprodurre eventi FMOD con gli ScriptableObjects
Quando creiamo uno script per riprodurre gli eventi, dichiariamo per prima cosa lo ScriptableObject:
[SerializeField]
private PlayerAudioData playerAudio;
Poi accediamo a qualsiasi variabile di stringa che abbiamo dichiarato nello ScriptableObject e riproduciamo così i nostri suoni:
void Start()
{
FMODUnity.RuntimeManager.PlayOneShot(playerAudio.jump);
}
In Unity ci assicuriamo di spostare il file .asset nel campo che è stato creato nell’inspector:
Ora, se abbiamo bisogno di spostare o rinominare un evento nel progetto di FMOD, dobbiamo solo cambiare il percorso specifico nel file .asset. Questo metodo ci fa risparmiare un sacco di ricerche negli script che abbiamo scritto settimane o mesi fa.