Flash-Animation in Unity3D von Grund auf neu. Teil eins, lyrisch

In dieser Artikelserie werde ich darüber sprechen, wie und warum wir beschlossen haben, eine eigene Lösung für den Import von Flash-Animationen in Unity zu erstellen, sowie über Optimierungstechniken und interne Funktionsweisen des Plug-Ins. Ich habe auch viele andere faszinierende Dinge zu erzählen: Interna des SWF-Formats, Besonderheiten der Unity-Editor-Erweiterung und allgemeine Fragen der Animation. Sie finden das alles drinnen!




Einführung


Wenn Sie an einem Projekt arbeiten, müssen Sie sich immer dem Problem stellen, die Technologien für die meisten seiner Komponenten auszuwählen. Eine dieser Komponenten ist natürlich das Animationssystem. Nun gibt es einige Variablen, von denen Ihre Wahl abhängt. Die erste Frage, die Sie sich stellen müssen, ist, an welche Tools Ihre Animatoren gewöhnt sind (mit denen sie arbeiten können) und welche davon für Sie leichter zu finden sind. Sicher, die Auswahl eines äußerst spezifischen Produkts macht wenig Sinn. In diesem Fall ist es fast unmöglich, Ihre Mitarbeiter zu ersetzen, wenn sie aus irgendeinem Grund abreisen (oder von einem Bus angefahren werden). Im Grunde genommen wird Ihr Projekt ganz oder teilweise auf unbestimmte Zeit gestoppt, was insbesondere für ein kommerzielles Produkt sehr teuer sein kann. Die zweite Variable ist eher technisch und es geht darum, die Werkzeuge in Ihren Motor zu integrieren. Gibt es Lösungen von Drittanbietern und wie ist deren Qualität? Haben Sie die Möglichkeit und Fähigkeit, Ihre eigene Lösung zu erstellen? Natürlich ist auch die Effizienz und Bequemlichkeit all dieser Faktoren von entscheidender Bedeutung. Und die dritte Variable sind die Fähigkeiten der Werkzeuge. Wenn Sie also wirklich, wirklich eine inverse Kinematik benötigen, wäre es sehr seltsam von Ihnen, eine Animation ohne Skelett zu bevorzugen.


Arten von 2D-Animationen


Schauen wir uns nun die beliebtesten Animationstechniken in Spielen an. Ich werde nur 2D-Animation betrachten, da 3D-Animation ein Thema für eine völlig andere Konversation mit eigenen Ansätzen und Werkzeugen ist. Sie können diesen Abschnitt gerne überspringen, wenn Sie mit dieser Angelegenheit vertraut sind (vertrauen Sie mir, es wird keine Enthüllungen oder Augenöffner geben). Wenn Sie nur hier sind, um die Funktionen der Flash-Animation zu sehen, finden Sie sie im folgenden Artikel.


Bild für Bild Animation


Starten Sie unseren Mini-Review, die einfachste und älteste Art von Animation: Einzelbildanimation. In dieser Animation wird jedes Bild durch ein einzelnes Bild dargestellt, und wenn diese Bilder sehr schnell geändert werden, entsteht die Illusion von Bewegung.


Vorteile:


Grundlegende Implementierung, normalerweise für jede Engine verfügbar. Bei jeder Komplexität und jedem Animationsstil können Sie sogar die gesamten Filmbilder einfügen (theoretisch natürlich). Beliebige Werkzeuge: Fast alles kann Ihnen eine Folge von Frames liefern, die Sie bei Bedarf zu einem Texturatlas zusammenstellen können.


Nachteile:


Der Hauptnachteil ist natürlich die Menge an Speicher, die all dieses Zeug benötigt. Natürlich können Sie alle Arten von Tricks anwenden, z. B. das Ausschneiden von Frames in Blöcke und die anschließende Wiederverwendung der sich wiederholenden Blöcke, das Laden von Frames von der Festplatte im Hintergrund und das Entfernen der bereits gezeigten Frames usw. Aber denken Sie daran, dass all diese Tricks auch ihre eigenen Nachteile haben. Zum Beispiel kann das Schneiden in Blöcken nur in der Pixelkunst verwendet werden. Das Laden im Hintergrund stellt eine zusätzliche Belastung für die Festplatte dar, beansprucht viel Speicherplatz auf dieser Festplatte und erhöht somit die Größe des Spiels selbst sowie die erforderliche Datenmenge damit ein Benutzer es starten oder aktualisieren kann.


Fazit:


Funktioniert nur für kleine und wenige Animationsrahmen, perfekt für Pixelkunst und Spiele im Retro-Stil wie NES .


Videoanimation


Grundsätzlich ist Videoanimation eine Apotheose des Frame-für-Frame-Wahnsinns. Und ja, es wird immer noch angewendet und manchmal sogar richtig. Wir haben so etwas in Wimmelbildspielen für umfangreiche und komplexe Animationen sowie für Zwischensequenzen mit einem Hauch von Realismus implementiert. Fügen Sie diesen Codecs wie theora oder vp8 hinzu , und Sie können ganz eigene Videoanimationen (auch mit Alpha-Compositing ) erstellen.


Das Gute an dieser Art von Animation ist natürlich, dass Sie fast alles erstellen können, von inszenierten Szenen mit echten Schauspielern bis hin zu gerenderten 3D-Schlachten. Eine schlechte Sache ist eine große Belastung für die CPU beim Dekodieren und natürlich für die Bildqualität. Der Kompromiss zwischen Qualität und Effizienz kann nur in einer begrenzten Anzahl spezifischer Fälle erreicht werden, wie in den oben genannten Wimmelbildspielen.

Videoanimationen sind also nicht jedermanns Sache und nicht immer anwendbar, fast nie, um genau zu sein. Grundsätzlich eignet sich diese Art der Animation nur für gerenderte Zwischensequenzen. Wenn Sie es schaffen, eine solche Animation gut umzusetzen, wird dies sicher kein Kinderspiel. Es sind unzählige Nuancen und Tricks zu beachten, sowohl hinsichtlich der Qualität des Ausgabebilds als auch der CPU-Auslastung. Aufgrund dieser Besonderheit gibt es nur sehr wenige gebrauchsfertige Implementierungen, die entweder nicht gut genug sind oder viel Geld kosten (Hallo, Bink_Video ). Daher schreiben die meisten Leute lieber ihre eigenen.


Skelettanimation


Gehen wir also zu populäreren und moderneren Arten von 2D-Animationen über. Skelettanimationen gewinnen immer mehr Herzen und Köpfe von 2D-Entwicklern und nähern sich dem Standard für Spielanimationen an. Das Komische ist, dass sie in letzter Zeit in 2D relativ populär geworden sind, im Gegensatz zu 3D, wo sie weit zurückreichen, als unsere Vorfahren Half-Life kreierten. Die Essenz der Skelettanimation ist, wie Sie sich wundern würden, ein Skelett, das von einem Animator erstellt wurde. Grundsätzlich ist ein Skelett eine Reihe von Knochen, die miteinander verbunden sind und eine Baumstruktur bilden. Die Knochen sind in Stücke gebunden, dargestellt durch einzelne Bilder. Diese Konstruktion beginnt sich zu bewegen, wenn Knochen relativ zueinander verschoben oder gedreht werden. Die Verschiebungen und Rotationen der Skelettknochen bleiben bei der allgemeinen Animationszeitleiste.


Die Profis liegen auf der Hand: Wir müssen nicht jeden Animationsrahmen als separates Bild speichern, sondern nur die Teile (z. B. Beine und Arme des Charakters), die von den Knochen bewegt werden. Es gibt einige wirklich coole Implementierungen dieser Art von Animation mit Laufzeiten für verschiedene Plattformen und Engines, die erschwinglich oder sogar kostenlos sind: Spine , Spriter , Anima2D , DragonBones und andere. Mit dem Skelett und seinen Funktionen können Sie eine unglaubliche Glätte Ihrer Animation erzielen, indem Sie die Positionen der Knochen interpolieren. Sie können auch die Übergänge zwischen den Szenen abwechseln und sogar zwei verschiedene Arten von Szenen mischen: Aufnahmen während des Laufens, Aufnahmen während des Kriechens und so weiter. Ich werde nicht alle Möglichkeiten der Skelettanimation auflisten, also denken Sie daran, dass es wirklich viele davon gibt und sie wirklich cool sind. Und ich möchte Ihnen lieber einen Link zur Spine-Website geben, auf der Sie sich alle mit Bildern und Beschreibungen ansehen können


Sieht so aus, als hätten wir unseren Universalsoldaten, aber noch nicht. Es hat auch seine eigenen Nachteile. Und ich muss gleich sagen, dass diese Nachteile bei vielen Projekten und Animationen möglicherweise gar nicht existieren. Wenn also die Skelettanimation für Sie funktioniert - das ist einfach großartig, verwenden Sie sie, denn sie sieht wirklich gut und modern aus.


Kehren wir nun zu den Nachteilen zurück. Die Skelettanimation erfordert ein zusätzliches Step-Rigging. Es geht um die Schaffung eines Skeletts und das Binden von Knochen und Stücken. Wenn Ihr Objekt nur eine Animation hat, nicht wenige, wie zum Beispiel den Charakter des Plattformspiels , ist dieser Schritt für Sie nicht sinnvoll. Sie sollten auch daran denken, dass nicht alle Szenen einfach mit Knochen animiert werden können. Tatsächlich gibt es viele Beispiele, bei denen es ohne sie besser ist, sowohl hinsichtlich der Erstellung als auch der Leistung des Endspiels. Ich möchte auch auf die Verfügbarkeit von Experten auf dem Markt als wichtigen Faktor hinweisen. Mit der zunehmenden Beliebtheit von Skelettanimationen wächst natürlich auch ihre Zahl, aber es wird Ihnen wahrscheinlich nicht leicht fallen, sie in Ihr Team aufzunehmen. Auch die Werkzeugvielfalt leistet ihren Beitrag. Jeder hat seine eigenen Vorlieben, und dennoch muss er flexibel und lernbereit sein, was zusätzliche Schwierigkeiten bei der Rekrutierung und Schulung Ihrer Mitarbeiter mit sich bringt.


Timeline-Animation


Ich habe diese Art von Animation zum letzten Mal gespeichert, nicht weil sie besser ist als alle anderen, sondern weil sie hauptsächlich durch Flash-Animationen dargestellt wird, über deren Innenseiten wir im technischen Teil dieses Artikels sprechen werden. Nun, Flash ist nicht der einzige Vertreter dieser Art von Animation, aber es ist sicherlich der führende. Von diesem Moment an werde ich alles in Bezug darauf beschreiben. Timeline-Animationsszenen bestehen aus Teilen, die in verschiedenen Ebenen auf der Timeline animiert sind. Im Grunde ist es fast dasselbe wie das, was wir in der Skelettanimation gesehen haben, aber ohne Skelette. Mithilfe der Keyframes auf der Timeline können wir diese Frames verschieben, drehen, ersetzen und neue Teile hinzufügen und natürlich Übergänge, Scale-Ups und Rotationen zwischen ihnen interpolieren. Dies bedeutet, dass wir in diesem Fall nicht die Knochen bewegen, an denen Teile befestigt sind, sondern die Teile selbst. Sicher, es beraubt uns vieler Möglichkeiten der Skelettanimation, aber wie ich bereits sagte, braucht nicht jeder sie. Darüber hinaus erhalten wir weitere Vorteile wie:


  • Fähigkeit, neue Teile mitten in einer Szene hinzuzufügen und einzufügen;
  • keine Takelage, keine Knochen, die manchmal einfach unnötig sind;
  • Adobe Flash (derzeit Adobe Animate ) ist das älteste und im Laufe der Jahre getestete Animationstool. Eine große Anzahl von Animatoren kann auf die eine oder andere Weise damit arbeiten.
  • Möglichkeit, alte Szenen beim Übertragen Ihrer Flash-Projekte nach Unity zu verwenden, einschließlich der Szenen, die Sie in Vektorgrafiken erstellt haben , nicht nur in Raster .

Sie fragen sich vielleicht, ist Flash nicht tot? Als Browser-Spieler - ja, aber als Animationswerkzeug ist es immer noch im Spiel. Und ich werde Ihnen mehr erzählen, es gibt derzeit keine Alternativen zu Flash oder dies ist vorgesehen. Gibt es irgendwelche Nachteile? Sicher. Und der Hauptnachteil ist, dass ... es keine Skelettanimation ist, ha-ha. Wir verlieren also die Fähigkeit, unsere Szenen miteinander zu mischen, die inverse Kinematik und einige andere Funktionen, die Sie nur verwenden können, wenn Sie mit Skeletten arbeiten. Aber wir haben Zeitleisten ineinander und auch Raster- und Vektormasken! Und Animatoren lieben Masken! Hier muss angemerkt werden, dass Spine kürzlich auch die Beschneidungsoption hinzugefügt hat, aber bisher sind sie nur geometrisch und im Vergleich zu Flash-Masken stark eingeschränkt.


Animationstypen: Zusammenfassung


Natürlich habe ich nicht alle Arten von Animationen aufgelistet, sondern nur die wichtigsten. Zum Beispiel habe ich eine sogenannte prozedurale Animation hinterlassen, wenn Objekte oder Teile nur durch Code gesteuert werden, aber es ist kaum möglich, diese mit anderen zu vergleichen, und ich wollte den Artikel nicht zu lang zum Lesen machen. Ich denke, jetzt ist es besser für uns, etwas näheres auf Animation zu betrachten, um das Bild zu vervollständigen.

Also, um es zusammenzufassen. Wie immer und anderswo gibt es hier keinen universellen Soldaten. Sie müssen Ihre Lösung abhängig von Ihrem Projekt, Ihren Aufgaben und Ihren Mitarbeitern auswählen. Wer sagt denn, dass Sie immer nur eine Art Animation verwenden müssen? Es gibt viele Projekte, in denen wir alle Arten von Animationen sehen können, und alle sind glücklich. Videoanimation für Zwischensequenzen, Skelett für Charaktere, Zeitleiste für Landschaften, Verfahren zum Fliegen von Emitterpartikelsystemen und Einzelbild für die Partikel selbst. Wir nehmen einfach das Beste aus jedem Typ.


Dilemma und Entscheidung, unsere eigene Lösung zu schreiben


Aus objektiven Gründen haben wir uns entschieden, dass wir für unser Projekt eine Flash-Animation benötigen. Dann stellte sich die Frage nach ihrer Integration in den Motor. Nachdem wir mehrere Plug-In-Optionen ausprobiert hatten, entschieden wir uns für die, die wir aufgrund ihrer Funktionen als am besten erachteten. Obwohl es lebendig und gut unterstützt war, hatte es auch eine völlig unerschwingliche Unternehmenslizenz, aber wer kann wirklich einen Preis für ein gutes Produkt setzen? Jetzt werde ich Ihnen absichtlich keine Namen geben, damit es nicht wie Werbung oder Anti-Werbung aussieht.

Wir haben fast ein Jahr lang mit diesem Plug-In entwickelt. In dieser Zeit wurde klar, warum wir es nicht weiter verwenden können. Insbesondere war es die Qualität seiner Integration in die Einheit. Dies führte zu ziemlich schwerwiegenden Fehlern, die von den Entwicklern nicht leicht, nicht schnell und nicht kampflos besiegt wurden. Die Leistung auf den Zielgeräten war ebenfalls schrecklich, und für uns bedeutet dies immer noch iPad 2- Level. Es geschah, weil wir versuchten, eine Integration in einen bestimmten Motor vorzunehmen, wobei wir dessen Besonderheiten und Schlaglöcher ignorierten. Wir waren mehr als zufrieden mit der Funktionalität, aber die Entwickler weigerten sich, den Quellcode auch auf individueller Basis für uns zu öffnen. So haben wir uns entschlossen, unsere eigene Lösung zu schreiben.

Ich hatte einige ziemlich erfolgreiche Erfahrungen beim Schreiben von Erweiterungen für Unity und ein wenig Erfahrung beim Konvertieren von Flash-Animationsszenen in meine eigenen Formate. Es ist schon einige Zeit seit dem letzten vergangen, um fair zu sein, aber etwas, an das ich mich noch erinnerte. Gleichzeitig habe ich beschlossen, dies alles als Haustierprojekt zu schreiben, damit ich nicht vom Hauptprojekt oder der Firma abhängig bin, in der ich arbeite. Und seien wir ehrlich, es ist schön, eine solche Produktion alleine zu haben. Wie auch immer, mit einer 250-seitigen SWF- Formatspezifikation bewaffnet, marschierte ich in die Schlacht.


Exportoptionen


Lassen Sie uns zunächst die Optionen für den Export von Animationen aus dem Flash-Editor erläutern. Es gibt einige davon, von denen jeder seine eigenen Vor- und Nachteile hat. Wir werden die wichtigsten durchgehen.


.XFL-Format


Im Flash-Animationseditor können Sie die Quelldatei in einem unkomprimierten .XFL-Format anstelle der standardmäßig festgelegten geschlossenen .FLA-Datei speichern. Dieses Format ist recht einfach zu bearbeiten, es enthält jedoch keine Dokumentation. Grundsätzlich besteht es aus einigen Unterverzeichnissen und einer ganzen Reihe von XML-Dateien, die alle Zustände der darin gespeicherten Clips beschreiben. Das Beschreibungsformat ist auch sehr einfach und verständlich, wie Sie dem folgenden Beispiel entnehmen können:


static_clip.xml

<DOMSymbolItem name="static_clip" itemID="5c719f28-00000051" lastModified="1550950184"> <timeline> <DOMTimeline name="static_clip"> <layers> <DOMLayer name="Layer_1" color="#00FFFF" current="true" isSelected="true"> <frames> <DOMFrame index="0" keyMode="9728"> <elements> <DOMBitmapInstance selected="true" libraryItemName="bitmap.png"/> </elements> </DOMFrame> </frames> </DOMLayer> </layers> </DOMTimeline> </timeline> </DOMSymbolItem> 
Quelllink

Was wir hier haben, ist dieser Clip, static_clip mit einer Ebene, Layer_1 und einem Frame, in dem ein Rasterbild namens bitmap.png .


movie_clip.xml

 <DOMSymbolItem name="movie_clip" itemID="5c719f30-00000053" lastModified="1550950713"> <timeline> <DOMTimeline name="movie_clip"> <layers> <DOMLayer name="Layer_1" color="#00FFFF" current="true" isSelected="true"> <frames> <DOMFrame index="0" duration="4" tweenType="motion" motionTweenSnap="true" keyMode="22017"> <elements> <DOMSymbolInstance libraryItemName="static_clip"> <matrix> <Matrix tx="-50" ty="-50"/> </matrix> <transformationPoint> <Point x="28.5" y="27.5"/> </transformationPoint> </DOMSymbolInstance> </elements> </DOMFrame> <DOMFrame index="4" tweenType="motion" motionTweenSnap="true" keyMode="22017"> <elements> <DOMSymbolInstance libraryItemName="static_clip" centerPoint3DX="128.5" centerPoint3DY="127.5"> <matrix> <Matrix tx="100" ty="100"/> </matrix> <transformationPoint> <Point x="28.5" y="27.5"/> </transformationPoint> </DOMSymbolInstance> </elements> </DOMFrame> </frames> </DOMLayer> </layers> </DOMTimeline> </timeline> </DOMSymbolItem> 
Quelllink

Hier sehen Sie die Beschreibung des Clips movie_clip , der aus zwei Keyframes mit den Indizes 0 bzw. 4 besteht. In diesen Frames wird unser Clip static_clip mit den Koordinaten (-50;-50) und (100;100) gespeichert. Hier gibt es Bewegungsbewegungen zwischen den Frames (eine prozedurale Animation, in unserem Fall nur eine Verschiebung ohne Skalierung und Drehung). Somit kann die Position des statischen Clips zwischen den Schlüsselbildern unter Verwendung einer linearen Interpolation der Koordinaten berechnet werden, die wir aus diesen Rahmen nehmen.

Natürlich wird im Falle einer echten Animation alles etwas komplizierter und sperriger sein, aber dennoch kann alles verstanden werden, auch ohne Dokumentation. Und es könnte Ihnen scheinen, dass dies das ist. Und tatsächlich sind mir mehrere Projekte und Unternehmen bekannt, die diesen Weg gegangen sind und recht erfolgreich waren, aber nicht ohne Einschränkungen und Schwierigkeiten. Und diese Schwierigkeiten sind die eigentliche Beule von .XFL:


  1. Tweens können sehr unterschiedlich sein, sowohl einfach - mit linearer Interpolation als auch komplexer - mit benutzerdefinierten Funktionen und Graphen dieser Interpolation; Das Morphing von Vektorgrafiken auf Tweens wird nur nach ihren eigenen Regeln durchgeführt, die nur für Macromedia- und Adobe-Benutzer verständlich sind.
  2. Vektorgrafiken werden wie alle Animationen mit Ausnahme von Rastergrafiken in einer Textdatei beschrieben. Dies bedeutet, dass Sie Ihren eigenen Rasterizer schreiben müssen, was aufgrund der Art und Komplexität des Vektorformats in Flash möglicherweise nicht möglich ist.
  3. Die Regeln für die Wiedergabe von Animationen, einschließlich der verschachtelten, müssen von Grund auf neu erstellt werden. Hierfür gibt es keine Dokumentation, und Antworten auf Fragen wie wann und welcher Frame angezeigt werden soll, wann zu wechseln ist und wann er ohne Interpolation belassen wird, müssen Sie selbst herausfinden und gleichzeitig versuchen decken Sie alle möglichen Fälle während Testläufen ab, was meiner Meinung nach eine nicht triviale Übung für eine allgemeine, nicht private Lösung ist.

Dies sind nicht alle Nachteile dieses Ansatzes, aber ich denke, dies reicht aus, um zu verstehen, dass es für eine allgemeine Lösung nur mit starken Einschränkungen funktionieren würde. Vor langer Zeit bin ich diesen Weg gegangen und habe an einem meiner Projekte gearbeitet. Es gab Flash-Zwischensequenzen mit klassischen Tweens (ohne benutzerdefinierte Interpolationsregeln und spezielle Interpolationsfunktionen), Jut-Raster-Grafiken und keine weiteren erweiterten Möglichkeiten, die der Flash-Editor bietet. Ich habe diese proprietäre Lösung ziemlich schnell und effizient entwickelt, aber es waren immer noch einige schwerwiegende Einschränkungen für die Animatoren erforderlich, damit sie nichts verwenden, was man als kompliziert bezeichnen kann. Der Ansatz hat das Recht zu existieren und es gibt einige darauf basierende Bibliotheken mit unterschiedlichem Schäbigkeitsgrad, aber wie gesagt, er funktioniert mit vielen Einschränkungen.


.JSFL-Skripte


Mit .JSFL-Skripten können Sie Ihren Flash-Editor erweitern, mit seiner Umgebung interagieren, Ihre Animation bearbeiten und natürlich alle erforderlichen Informationen zu den darin enthaltenen Zeitleisten, Ebenen, Clips und Frames abrufen . Es wird auch von Animatoren zur Automatisierung verschiedener Prozesse verwendet, aber dies ist tatsächlich eine ganz andere Geschichte. Insgesamt weist der Ansatz alle Nachteile des vorherigen auf, sodass ich nicht weiter darauf eingehen werde. Lassen Sie mich nur sagen, dass Sie damit Ihre Animationsszenen beispielsweise Frame für Frame exportieren können, aber wir wissen, dass dies nicht das ist, was ein echter Jedi tun würde (aber natürlich könnte dies in einigen Fällen der Fall sein Projekte). Wir werden später auf diese Skripte zurückkommen, wenn wir den von mir gewählten Ansatz diskutieren: für die Rasterung von Vektorgrafiken und die Optimierung der exportierten Szenen.


AIR-Anwendung


Dieser Ansatz funktioniert wirklich und kann so verwendet werden, wie er sollte. Trotzdem habe ich es nicht gewählt, aber ich werde Ihnen nur zur Veranschaulichung von dieser Option erzählen. Das Wesentliche dieses Ansatzes ist, dass wir eine AIR-Anwendung auf Flash selbst oder für Puristen beispielsweise auf Haxe erstellen. Diese Anwendung extrahiert alle Informationen aus den Animationsszenen, die Sie bereits im SWF-Format kompiliert haben. In der Anwendung spielen wir die Szene Frame für Frame ab, erhalten alle Informationen zu Frames und speichern sie in dem für unsere Laufzeit am besten geeigneten Format. Mit dieser Methode lösen wir alle oben genannten Probleme:


  • Wir müssen unsere Vektorgrafiken nicht rastern, da dies zur Flash-Laufzeit erfolgt. Wir müssen nur noch diese Informationen abrufen und die Rasterausgabe unserer Vektorstücke speichern.
  • Wir müssen keine Wiedergaberegeln erfinden und uns nicht mit der benutzerdefinierten Tween-Interpolation befassen. Der in die AIR-Anwendung integrierte Flash-Player weiß genau, wie es gemacht werden soll, und erledigt im Grunde die Arbeit für uns.

Als Bonus erhalten wir die Möglichkeit, Frame-Skripte zu verwenden (alle play() , stop() und andere gotoAndPlay() , einige Animatoren mögen sie wirklich). Als Nachteil verlieren wir die Möglichkeit, die in Flash selbst geloopten Szenen zu exportieren. Aber es ist wirklich nicht so schlimm, denn wir können sie in unserer Laufzeit schleifen, und die Animatoren könnten alles dafür vorbereiten.


Es sollte jetzt angemerkt werden, dass ich sicher bin, dass alles mehr oder weniger schwieriger sein wird, als ich es beschreibe, da ich persönlich nicht dorthin gegangen bin, also kann ich Ihnen nicht wirklich alle Details erzählen. Ich begrüße diejenigen, die diesen Weg gegangen sind, um ihre Erfahrungen zu teilen. Ich freue mich, über Ihre Erfolge und Misserfolge zu lesen!


Dein eigener Flash Player


Dies ist wahrscheinlich die fairste, offensichtlichste und einfachste Option unter allen, aber auch die schwierigste. Das macht schließlich ein echter Flash-Player, den die meisten von uns als Add-On im Lieblingsbrowser installiert haben. Nun sind die populären Vertreter dieses Genres: gameswf und, geboren aus dem ersten, scaleform . Beide sind heute tot. Das Faszinierende an ihnen ist, dass sie hauptsächlich für GUI- Implementierungen in verschiedenen Projekten einschließlich AAA verwendet wurden . Unser Interesse gilt jedoch den Interna, nicht den Anwendungen toter Bibliotheken.


In jedem anständigen Flash-Player sind mindestens zwei wichtige Dinge verborgen:


  • Parser im SWF-Format;
  • Vektorgrafiken Rasterizer;
  • virtuelle Maschine zum Starten von ActionScript des Codes;
  • Standardbibliothek für einen benutzerdefinierten Code;

Ich weiß, dass du denkst. Jeder dieser Punkte schreit, dass Sie, selbst wenn so etwas implementiert werden kann, mehr als ein Team für diese Aufgabe wechseln und einige Jahre für die Entwicklung der Basisversion aufwenden müssen. Selbst die Implementierung einer kleinen Rolle, um etwas zu spielen, wird lange dauern, und Sie können sicher sein, dass sich die weiteren Ergänzungen in Form vieler undokumentierter Teile dieser Pipeline in dieser langen Zeit verdoppeln werden.


Ja, das Internet ist voll von Versuchen, jeden dieser Teile zu implementieren, die sich in Grad an Schäbigkeit und Fehlerhaftigkeit unterscheiden. Aber Sie können diese Entwicklungen nicht einmal als Grundlage für Ihre eigenen Sachen nehmen, da Sie Jahre nur für die Fehlersuche aufwenden müssten. Außerdem müssten Sie alle ungeschriebenen Unit-Tests hinzufügen, bevor Sie feststellen, dass Sie niemals in der Lage sein werden, jede Kleinigkeit vollständig zu implementieren. Die Leute, die versucht haben, gameswf die notwendigen Funktionen hinzuzufügen, werden verstehen, wovon ich spreche. Ein fairer Flash-Player sollte Vektorgrafiken auch nicht im Voraus, sondern zur Laufzeit rastern, was sich so stark auf die Leistung auswirkt, dass nicht jedes Projekt durchkommt. Übrigens möchte ich die Überlebenden begrüßen, die versucht haben, scaleform auf Mobilgeräten zu verwenden. Auf jeden Fall ist dies der feierlichste und hoffnungsloseste Weg, und es ist definitiv nicht unsere Wahl.


Ansätze kombinieren


Also gehen wir endlich zu meiner Option. Nachdem ich alle möglichen Wege studiert hatte, kam ich auf diese interessante Kombination. Es ist relativ einfach zu implementieren, von einer Person verwaltbar und verfügt gleichzeitig über genügend Funktionen, um alle Anforderungen fast jeder 2D-Timeline-Animationsproduktion abzudecken.


Zuerst werden wir die in SWF kompilierte Animationsszene verwenden, um nicht verschiedene Wiedergabeoptionen zu erfinden und fast nie zu erraten, wie der Flash Player im Inneren funktioniert, da wir möglicherweise nicht alle Fälle abdecken können, aber wir sind immer noch auf der Suche nach der allgemeinen Lösung. Außerdem entfernt der Flash-Editor alle Tweens, die wir in unserer Animation verwendet haben, und gibt uns nur die nackten Positionen der Teile in der kompilierten SWF.


Zweitens verbieten wir die Verwendung von Skripten in Animationen. Ja, diese Anforderung ist sicherlich sehr schwierig und traurig, aber ich habe nicht ein ganzes Team von Programmierern, um eine anständige virtuelle Maschine und eine Standardbibliothek zu implementieren, die sie fast mit verbundenen Augen schreiben müssten. Hier sehen Sie natürlich einen Nachteil meines Ansatzes im Vergleich zur AIR-Anwendungsmethode. Im zweiten Fall könnten wir einige Skripte für die interne Animationswiedergabe verwenden. Gleichzeitig hindert es uns nicht daran, gute Animationsszenen zu erstellen. Um benutzerdefinierte Informationen aus der Szene in das Spiel zu übertragen, können Sie sogenannte frame labels , die Sie im Code finden. Sie können Benutzerereignisse auch mithilfe der Rückruffunktionen der Laufzeit an die jeweiligen Frames anheften.


Dann müssen wir nicht mehr unseren eigenen Vektorgrafik-Rasterizer schreiben, da wir ihn nicht für den allgemeinen Fall schreiben können und alle Optionen und Möglichkeiten von Vektoren in Flash abdecken können. Stattdessen werden wir unsere Grafiken vor der (!) Kompilierung mit einem JSFL-Skript rastern. In der Zwischenzeit werden wir mithilfe dieses Skripts unsere Vektorgrafiken optimieren, indem wir statische Clips in einem Bild zusammenführen und die resultierenden Rasterbilder aus Gründen unserer eigenen Priorität vergrößern oder verkleinern: Qualität und / oder Leistung. Auch hier lohnt es sich, Kunstqualitäts- / Auflösungsoptionen für Geräte mit unterschiedlicher Bildschirmpixeldichte (z. B. HD- und SD-Grafik) zu berücksichtigen.


Abschluss des lyrischen Teils


Damit ist der erste Teil meines Artikels abgeschlossen. Im zweiten Teil werden Details zur technischen Implementierung, Codefragmente, Bilder (!), Optimierung, Tricks und Optimierungen besprochen. In Kürze nicht verpassen!

Source: https://habr.com/ru/post/de445102/


All Articles