Hat Unity Unterstützung für Timelines?

13

Ich plane die Entwicklung eines Spiels in Unity3D und versuche herauszufinden, was die Engine bereits bereitgestellt hat und was ich selbst codieren muss.

Das Spiel selbst wird ein Rhythmusspiel sein, bei dem Audio- und Grafikereignisse so synchronisiert werden, dass sie immer zum gewünschten Zeitpunkt wiedergegeben werden. Was ich vermeiden möchte, ist ein potenzielles Szenario der Verzögerung, bei dem entweder das Audio oder die Grafiken schneller als die anderen fortschreiten.

Als wir diese Art von Koordinierungssystem in meiner Game-Design-Klasse an der Universität diskutierten, nannte mein Professor diese Art von Design eine "Timeline" -Klasse. Die Idee ist, dass Sie eine oder mehrere dieser Instanzen instanziieren können, um unterschiedliche Fortschritte zu erzielen, zukünftige Ereignisse zu planen und regelmäßige Ereignisse zu synchronisieren. Die Bezeichnung einer "Timeline" -Klasse scheint jedoch auf meinen Professor selbst beschränkt zu sein, da die Prüfung, ob eine bestimmte API über die "Timeline" -Funktionalität verfügt, ein erfolgloses Unterfangen war.

Gibt es einen allgemeineren Namen für diese Art von Funktionalität? Gibt es in Unity bereits Methoden, um die Planung von Ereignissen wie folgt zu koordinieren, oder muss dies auf die Engine aufbauen? Und wenn doch, würde ich mich freuen, auf einige Tutorials hingewiesen zu werden!

Raben-Träumer
quelle
Ich habe auch ähnliche Timeline-Klassen verwendet (sie hatten sogar den gleichen Namen). Ein gebräuchlicherer Name für das Muster ist mir unbekannt, wird jedoch wahrscheinlich häufig über funktional-reaktive Programmierung, Coroutinen oder andere asynchrone Konzepte implementiert.
Interphx

Antworten:

10

Obwohl diese Funktionalität in Unity nicht verfügbar ist, sollte eine grundlegende Implementierung einer solchen Zeitachse nicht allzu schwierig sein.

So würde ich vorgehen:

  • Ihre Timeline- Klasse verwendet intern eine Prioritätswarteschlange als Datenstruktur zum Speichern von Ereignissen.
  • Ein Ereignis kann nur eine Zeit und ein Rückruf sein. So Hinzufügen Ereignisse in die Timeline wäre so einfach wie: timeline.AddEvent(0.25f, MyCallback).
  • Mit jedem Updatewürde die Timeline-Klasse:

    1. Erhöhen Sie den Abspielkopf (einfach float) um die verstrichene Zeit
    2. Überprüfen Sie den Kopf der Prioritätswarteschlange und entfernen Sie alle Ereignisse, deren Priorität (z. B. Zeit) kleiner oder gleich dem aktuellen Abspielkopf ist, und rufen Sie den Rückruf auf.

Wenn Sie eine Art Rücklauf- oder Wiedergabefunktion benötigen , wäre es natürlich töricht, alle Ereignisse aus der Warteschlange zu entfernen (dh, Sie müssten sie beim Zurückspulen erneut hinzufügen). Stattdessen können Sie auch ein Array verwenden, das Ihre Ereignisse enthält . Eine Veranstaltung würde aus einem Timeund bestehen Callback. Sie müssten Ihr Array sortiert halten Time.

Anstatt Elemente aus dem Array zu entfernen, würden Sie den aktuellen Array-Index verfolgen und bei jeder Aktualisierung vor diesem Index suchen und alle Rückrufe mit ausführen, Playhead >= Timewährend Sie den Index entsprechend erhöhen.

Das Implementieren einer schnelleren Wiedergabegeschwindigkeit funktioniert mit beiden Implementierungen und ist so einfach wie:

Playhead += Time.deltaTime * playbackSpeed
Blödmann
quelle
2
"Inkrementieren Sie den Abspielkopf (ein einfaches Float) um die verstrichene Zeit" - Wenn Sie dies tun, erhalten Sie aggregierte Gleitkommafehler. Sie sollten stattdessen Time.time (die Zeit seit dem Start des Spiels) verwenden.
BlueRaja - Danny Pflughoeft
4

Nein, Unity3D verfügt nicht über eine solche Standard-API.

Es unterstützt jedoch Coroutinen, und ich schlage vor, Sie untersuchen sie. Coroutinen machen das Planen und Synchronisieren von Ereignissen im Allgemeinen sehr einfach.

Keine Ursache
quelle
1

Ich bin mir nicht sicher, ob dies seit den Antworten von 2012 neu ist, aber Unity unterstützt tatsächlich die Zeitleistensteuerung über den (Legacy-) Animations-Editor .

Obwohl diese Funktion hauptsächlich zum Animieren von Objektparametern mit Kurven vorgesehen ist, können Skripts für Animationsereignisse ausgelöst werden . Diese Skripte könnten Ihre Grafik und Audio steuern.

DMGregory
quelle