Oft ist das Hardcoden der Eventpfaden im Code nicht die beste Lösung, um einen Überblick der vorhandenen Events im Spiel zu erhalten. Verschieben oder benennen wir z.B. ein Event in FMOD Studio um, dann muss auch der Eventpfad im Code aktualisiert werden. Das nimmt Zeit in Anspruch. Etwas übersichtlicher ist es, wenn wir unsere Events in ScriptableObjects organisieren.
Lade dir das Unity & FMOD Projekt zu diesem Tutorial herunter.
Inhaltsverzeichnis
Was sind ScriptableObjects?
Scriptable Objects können zur Speicherung von Informationen verwendet werden. Sie sind sehr nützlich, um Konfigurationen für dein Spiel, sowie für den Editor zu speichern.
Aus einer technischen Perspektive erben ScriptableObjects genau wie MonoBehaviours von UnityEngine.Object. Wir können darin Felder und Methoden definieren, oder auch einige Unity-Callbacks verwenden: Awake(), OnDestroy(), OnEnable() und OnDisable(). Aber es gibt z.B. keine Update()-Methode. Im Gegensatz zu MonoBehaviours werden ScriptableObjects in der Szene (oder in Prefabs) nicht serialisiert und nicht als Components von GameObjects verwendet. Stattdessen werden sie als Assets in den Projektordnern gespeichert – genau wie Texturen, Modelle und Skriptdateien.
Vorbereitung für die Erstellung von ScriptableObjects
Wir erstellen einen Skript, der Events in Form von Strings für einen hypothetischen Spieler auflistet. Damit können wir später eine Asset-Datei erstellen, die wir in anderen Skripts verwenden können, um auf die Pfade von Events zuzugreifen:
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;
}
Wie wir sehen, erbt der Skript nicht von MonoBehaviour, sondern von ScriptableObject. Das heißt, wir können dieses Scriptable Object nicht direkt als Component verwenden. Stattdessen, können wir über Unitys Menu eine Asset-Datei erstellen, welche alle von uns definitieren Daten enthält:
Unity erstellt daraufhin eine neue Asset-Datei mit dem Namen New Player Sheet (den wir im vorher erstellen Skript natürlich ändern können). Benennen wir die Datei in so was wie: PlayerAudio um. Wenn wir auf die Datei klicken, sehen wir im Inspector leere FMOD Events Felder, die wir mit Events auffüllen können:
FMOD Events mit Scriptable Objects abspielen
Wenn wir ein Skript zum Abspielen von Events erstellen, dann deklarieren wir zuerst das Scriptable Object:
[SerializeField]
private PlayerAudioData playerAudio;
Danach greifen wir auf eine beliebige String-Variable, die wir im Scriptable Object deklariert haben und spielen so unsere Sounds ab:
void Start()
{
FMODUnity.RuntimeManager.PlayOneShot(playerAudio.jump);
}
In Unity stellen wir sicher, dass wir die Scriptable Object Asset-Datei im dafür angelegten Inspector Field schieben:
Wenn wir jetzt in FMOD Studio ein Event unbebennen oder verschieben sollten, dann brauchen wir nur den Pfad in die Asset-Datei zu ändern. Das spart uns langes Suchen in Skripts, die wir vor Wochen oder Monaten geschrieben haben.