
In diesem Beitrag werde ich erzählen, wie ich mein Flash-Spiel Frog Fractions auf die moderne Plattform gebracht habe. Als Ergebnis habe ich mit Haxe einen teilweise automatisierten Port für Unity erstellt. Der Beitrag ist für alle interessant, die versuchen, ihre Codebasis auf Flash zu aktualisieren. Der Beitrag wird Spoiler über die Struktur von Frog Fractions: Game of the Decade Edition und die ILCic Cap von DLC Hop enthalten .
Nach Frog Fraktionen 2 mich reich machen gescheitert, verbrachte ich etwa ein Jahr zu tun Vertrag Arbeit und Skizzieren / Prototyping . Dann wurde meine Frau schwanger und ich entschied, dass es Zeit war, einen richtigen Job zu finden, damit ich meine Familie ernähren konnte. Vor dem Start der GDC 2018 habe ichhat einen Tweet über die Arbeitssuche gepostet , in der Hoffnung, die richtigen Leute auf der Konferenz zu finden. Ich wurde an mehreren Orten interviewt, aber das Wichtigste war, dass ich Mittel für mein nächstes Projekt finden konnte.
Das Projekt war wie folgt: Verstecke das nächste Frog Fractions-Spiel in Frog Fractions 1 und verkaufe es auf Steam.
Frog Fractions besteht aus ungefähr 13.000 Codezeilen in Actionscript 3 und wird mit dem Flex-Compiler erstellt. Ich nahm an, dass sich das Volumen nach dem Hinzufügen neuer Remaster-Inhalte auf etwa 40.000 Codezeilen verdreifachen würde. (Und meine Schätzung erwies sich als ziemlich genau - es stellte sich heraus, dass zusätzlich zum ursprünglichen Spiel 28.000 C # -Code und 3.000 Zeilen Skripte für Zwischensequenzen / Dialogbäume vorhanden waren.)
Ich überlegte mehrere mögliche Optionen für die weitere Arbeit:
- AS3 Adobe AIR. , :
- Frog Fractions 640x480. . 2012 , , 2020 Steam .
- Flex , 10k , . 40k ? ( , , .)
- Flash . AIR 2020 ? (, ! .)
- , - . , Scaleform (The Banner Saga, Road Not Taken), , Scaleform - 2020 . (, 2018 Autodesk Scaleform, — UI.)
- Flash VM -. Flash , . Ruffle. , ?
- C#/Unity. .
- : Flash, , Unity. , «-» . , , , Unity, Windows. ( , , , TCP- . Flash , , Unity, .)
- Haxe OpenFL. as3hx AS3 Haxe, OpenFL Flash API. OpenFL , .
Ich möchte hier betonen, dass all diese Ansätze auf der Tatsache beruhten, dass Frog Fractions im Wesentlichen ein Programm war, das ich geschrieben habe, um es an SWF zu kompilieren. Ich kann nicht beurteilen, wie meine Lösung auf Ihr Spiel anwendbar ist, wenn es sich um eine Flash-Animationszeitleiste handelt, deren Interaktivität durch Skripte bereitgestellt wird.
Ich bat um Rat, wie ich vorankommen könnte, und der nützlichste wurde mir von Lars Duset gegeben, der unter anderem sagte, dass Haxe ein C # -Backend hat und seine Zielplattform Unity sein könnte. Er riet mir auch, zuerst einen Workflow zu entwickeln und ein kleines Projekt damit zu portieren.
(Hinweis für mich: Fügen Sie Lars Dusset zu den Credits des Spiels hinzu. Ich konnte mir nicht vorstellen, welchen Einfluss er auf das Projekt hatte, bis ich unsere Korrespondenz erneut las.)
Nach einer Woche des Experimentierens konnte ich Frog Infarctions (ein Spiel, das ich Sosa Sosovskis 0-Stunden- Spielestau geschrieben habe) im Unity-Editor ausführen. Das Ergebnis war nicht ideal, aber es reichte aus, um die Machbarkeit der Implementierung zu verstehen, und so begann ich mit der Arbeit am Hauptprojekt.
So stellte sich mein Workflow heraus. Diese Vorgänge müssen einmal ausgeführt werden:
- Verwenden Sie as3hx, um den Code von AS3 nach Haxe zu konvertieren.
- Bereinigen Sie gegebenenfalls den generierten as3hx-Code manuell.
Führen Sie danach iterativ die folgenden Operationen aus:
- Portieren Sie Ihre Codebasis nach Haxe, um die Unity-API anstelle der Flash-API zu verwenden.
- C#- Haxe Haxe C#. Haxe, UnityEngine.dll, API hx. Assembly-Csharp.dll C#, .
- Unity.
Die erste Arbeitswoche war sehr langwierig. Sie mussten die als inkonsistent gekennzeichneten Ausdrücke von as3hx bereinigen, die hinzugefügten Compilerfehler beheben und E / A-Aufrufe verarbeiten. Das Beheben von Fehlern in Haxe ist nicht perfekt, daher gab es jedes Mal, wenn ich versuchte zu erstellen, ungefähr 30 Fehler, egal wie sehr ich es versuchte. Ich hatte keine Ahnung, wie kurz vor dem Abschluss, bis alles fehlerfrei kompiliert wurde. Außerdem scheint mir as3hx ein Such- und Ersetzungsübersetzer zu sein und kein echter Transpiler mit Übersetzung von und nach AST, da es Fehler hinzuzufügen scheint, wie z. B. das Platzieren des Codes auf der falschen Seite der Klammern in meinem Die Flusskontrolle verwendet einen bestimmten Stil von Klammern.
Damit habe ich eine Haxe-Codebasis erhalten, die erfolgreich zu einem C # -Ziel kompiliert werden kann. Danach habe ich den AS3-Code noch nie berührt. (Mit Ausnahme des unten beschriebenen Exportprozesses für grafische Assets.) Zu diesem Zeitpunkt habe ich beschlossen, Haxe aufzugeben und nur in C # zu arbeiten. Obwohl die Ausgabe von as3hx dem ursprünglichen Code ziemlich ähnlich ist, bleibt die Ausgabe von Haxe erhalten, wobei der Klammerstil, die Codereihenfolge und die Kommentare beibehalten werden C # ist offensichtlich nicht für das menschliche Auge gedacht. Wenn ich von nun an keine neuen Szenen erstellt habe, habe ich den Haxe-Code bearbeitet und in C # kompiliert.
Zu diesem Zeitpunkt wurde der Code kompiliert und in der Unity-Engine ausgeführt, jedoch ohne E / A. Der nächste Schritt bestand darin, den gesamten E / A-Code mithilfe der Unity-API neu zu erstellen. Dies und die Ressourcenkonvertierung dauerten ungefähr vier Monate, hauptsächlich weil es in Frog Fractions viele verschiedene Ressourcentypen gibt:
- Im Flash-Editor gezeichnete Vektorgrafiken. Ich habe es als 4k gerendert und AIR gezwungen, das ursprüngliche Spiel zu erstellen, aber nichts weiter getan, als die Animationsframes zu rendern und sie in PNG-Dateien zu schreiben. Dann habe ich sie mit einem TexturePacker zu Sprite-Blättern zusammengesetzt.
- , Flash Shape API. Flash , , Photoshop . . Unity . , , 9-slices, .
- SVG, OpenClipArt.org. , , .
- , Flickr. preserve details Photoshop, , 4k- , .
- . , . , 4k. , , — !
- . Flash- , Marching-Cubes . 4k, , . , .
- , .
- . 2015 Unboxing Story Unity API . 2018 . !
- . .wav .
- MP3 64kbps mono, , , Amazon S3, , OST.

Alles im Remaster außer den Vollbild-Shadern und der Videowiedergabe. Der größte Teil der neuen Story wird mithilfe von Graphics.DrawMesh-Aufrufen gerendert, nicht als Objekte im Unity-Szenendiagramm. Die Frage ist also, ob Unity wirklich für dieses Projekt geeignet ist.
Während Craig Tympani und ich den Motor für Glittermitten Grove auswählten , entschieden wir uns für Unity wegen seiner guten plattformübergreifenden Unterstützung, weil FNANoch nicht fertig und weil das Bauen einer eigenen Engine eine großartige Möglichkeit ist, ein Spiel niemals zu beenden. Obwohl ich über die schlechte 2D-Unterstützung in Unity traurig war, konnten wir letztendlich fast problemlos Versionen für Mac und Linux veröffentlichen, was meiner Meinung nach ein großer Erfolg ist. (Vermutlich hat sich die 2D-Unterstützung in Unity seit 2015 verbessert, aber ich habe sie nicht studiert. Graphics.DrawMesh funktioniert gut für mich. Vielleicht hat sogar FNA jetzt eine funktionierende Pipeline für die Ressourcenverarbeitung!)
Für dieses Projekt habe ich Unity hauptsächlich aufgrund der Trägheit ausgewählt - Ich wollte mir nicht die Mühe machen, einen neuen Motor zu studieren, weil ich das oben beschriebene Forschungsprojekt durchführen musste. Unity unterstützt alle Plattformen, auf die ich das Spiel portieren wollte, einschließlich Konsolen.
Oh, und dann habe ich ein zusätzliches Spiel erstellt! Ich werde wahrscheinlich in einem anderen Beitrag über diesen kreativen Prozess sprechen. Hier werde ich nur erwähnen, dass ich eine Übergangsszene in Haxe zusammengestellt und den Rest des neuen Spiels in C # geschrieben habe. Außerdem habe ich wesentliche Änderungen am Hauptmenü in der Haxe-Codebasis vorgenommen. Daher scheint es mir durchaus möglich zu sein, nach der Portierung auf Haxe weiterhin Code-Updates zu veröffentlichen, indem die Entwicklung auf Haxe durchgeführt wird.
Ich habe auch einige Optimierungen am ursprünglichen Code vorgenommen. AS3-Code wurde absichtlich ohne Rücksicht auf Effizienz geschrieben, weil ich versucht habe, das Streben nach "fehlerfreiem Code" zu vermeiden. Zum Beispiel konnte ich nicht glauben, dass ich es schaffen könnte, bei jeder Rechenoperation einen Vector2 für den Heap zuzuweisen! Das resultierende Ergebnis funktionierte auf Computern von 2012 gut, aber die Teile mit der schlechtesten Leistung nach doppelter Transpilation verursachten einen erheblichen Overhead. Um auf modernen PCs gut zu funktionieren, musste ich einen Teil des Codes in nativem C # neu schreiben.
Es ist auch erwähnenswert, dass OpenFL, AIR oder Ruffle wahrscheinlich eine klügere Wahl wären, wenn ich nicht geplant hätte, die Größe des Originalspiels signifikant zu vergrößern und es nur zusammen mit Flash vor dem Tod zu bewahren.
Das Spiel zu veröffentlichen war wie sich von ihr zu verabschieden. Ich habe es genossen, in Flash zu arbeiten. Zu dieser Zeit war es die beste Möglichkeit, Ihre Spiele mit geringstem Aufwand den Menschen zu zeigen, und es schien, als würden sie für immer leben - SWFs aus den 90er Jahren funktionieren im neuesten Flash-Player immer noch einwandfrei, obwohl Jahrzehnte vergangen sind. Es war unerträglich, der Welt zuzusehen, wie sie versuchte, auf HTML5 umzusteigen, als es eindeutig nicht bereit war. (Und ehrlich gesagt werden die Dinge eher schlechter als besser . Ich glaube, dass der Browser nie wieder eine spielbare Plattform sein wird, solange die Besitzer der beiden beliebtesten Browser ihre eigenen Telefon-App-Stores haben.) dass er ein neues Spiel verkaufen wollte, aber auch aus dem aufrichtigen Wunsch heraus, seinen Teil der Spielgeschichte zu behalten. Danke, dass du mit mir zu ihr zurückgekommen bist!