Unity Tutorial – StateMachineBehaviour vs. MonoBehaviour – Komponenten an Behaviours binden
Nachdem ich im vorherigen Tutorial die Grundlagen der StateMachineBehaviour-Skripte behandelt habe, werde ich dieses Mal noch etwas tiefer einsteigen.
Und zwar will ich Dir zum einen die Unterschiede zwischen StateMachineBehaviour und MonoBehaviour aufzeigen und zum anderen werde ich dieses Wissen gleich dafür nutzen die Audio-Steuerung unseres Spielers zu verbessern.
StateMachineBehaviour
Dass die StateMachineBehaviour-Skripte anders sind als die normalen Skripte, die man GameObjects anhängt, dürfte einem sofort klar sein, wenn man das erste Mal ein solches in MonoDevelop öffnet. Wo aber genau die Unterschiede liegen und was das auch für Probleme bereiten kann, möchte ich Dir in diesem Unity3D-Tutorial erläutern.
Optimierungen bei der Sounderzeugung
Das ganze mache ich natürlich nicht ganz ohne Hintergedanken. Denn ich möchte unsere Sounderzeugen aus dem letzten Tutorial etwas optimieren.
Bisher erzeugen wir für jeden einzelnen Sound zur Laufzeit eine neue AudioSource, die dann den jeweiligen Klang abspielt. Betrachten wir das Schießen, bedeutet dies, dass wir momentan für jeden einzelnen Schuss eine AudioSource erzeugen. Dass dies nicht gerade optimal ist, kannst Du Dir sicher vorstellen.
Deswegen werde ich Dir in dem folgenden Unity3D-Tutorial zeigen, wie Du dies optimieren kannst.
Video-Tutorial
Hier ist da Video, viel Spaß damit!
Den Download-Link zu den Audiodateien, die ich in dem Video nutze, erhältst Du in diesem Unity3D-Tutorial.
Nächste Folge
Im nächsten Unity-Tutorial werden wir uns um bewegliche Hindernisse kümmern, die sowohl Sprite-Animationen als auch Cutout-Animationen nutzen.
Echt super, dass Du diese Doppelfolge gebracht hast. Das Thema State Machine Behaviour ist ja noch sehr neu. Und diese Unterschiede waren mir jetzt so nicht bekannt. Danke!
Hi Maik, gern geschehen! Schön, dass Dir die Videos geholfen haben 🙂
Hey Carsten,
du kannst doch in der „OnStateEnter“ Methode über den Animator und der Funktion „GetComponentInParent“ eine Komponente vom Typ „AudioSource“ holen, dort den Clip setzen und dann Play ausühren, so brauchst du nur ein Skript mit einer Public Variable Clip vom Typ „AudioClip“ wo du den Sound setzt und schon spielt er den passenden Sound ab.
Wenn du jetzt noch wissen willst welcher State das ausgelöst hat kannst du den Parameter „stateInfo“ der „OnStateEnter“ Methode nutzen und per „stateInfo.IsName(„jump“)“ den State in dem er sich befindet abfragen, was aber eigentlich unnötig ist da du ja jedem State das Skript mit dem jewiligen Sound zufügst und so immer der richtige Sound abgespielt wid.
Hier noch ein Beispiel: http://pastebin.com/DkZMX1C2
Hi Toni, das ist richtig und das kann man auch machen. Der Nachteil ist, dass Du jedes Mal GetComponentInParent ausführen müsst, wenn Du den Sound abspielen möchtest. Mit meiner Variante machst Du die Zuweisung nur einmal, was etwas performanter ist.