在本文中,我将分享如何将Flash游戏Frog Fractions带入现代平台。结果,我使用Haxe在Unity上创建了部分自动化的端口。任何试图将其代码库升级到Flash的人都将感兴趣。该帖子将包含有关“青蛙片段:十年版游戏”及其DLC Hop的偶像帽的结构的破坏者。
在Frog Fractions 2未能使我致富之后,我花了大约一年的时间从事合同工作 和草绘/制作原型。然后我的妻子怀孕了,我决定是时候找到一份真正的工作,以便我可以养家糊口了。在GDC 2018开始之前,我发布了一条有关寻找工作的推文,希望在会议上找到合适的人。我在几个地方接受了采访,但是最重要的是我能够为我的下一个项目找到资金。
该项目是这样的:将下一个“青蛙分数”游戏隐藏在“青蛙分数1”中,然后在Steam上出售。
Frog Fractions在Actionscript 3中大约是13,000行代码,是使用Flex编译器构建的。我发现添加新的remaster内容后,卷的数量将增加三倍,达到大约4万行代码。(而且我的估计结果非常准确-除原始游戏外,结果还显示28k C#代码和3k行脚本用于过场动画/对话树。)
我考虑了进一步工作的几种可能选择:
- 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 , .
在此我要强调的是,所有这些方法都是基于Frog Fractions本质上是我编写并编译成SWF的程序这一事实。我无法判断我的解决方案如何适用于您的游戏,如果它是Flash动画时间轴,其交互性是由脚本提供的。
我到处询问有关如何前进的建议,最有用的是Lars Duset给我的,他说Haxe具有C#后端,其目标平台可以是Unity。他还建议我首先提出一个工作流程,并使用它来移植一个小项目。
(请注意:将Lars Dusset添加到游戏中,直到我重新阅读我们的信件,我无法想象他对项目产生了多大的影响。)
经过一周的实验,我能够在Unity编辑器中运行Frog Infarctions (我写了Sosa Sosovsky的0小时游戏果酱的游戏)。结果并不完美,但是足以理解实施的可行性,因此我开始从事主要项目。
这就是我的工作流程的结果。这些操作必须执行一次:
- 使用as3hx将代码从AS3转换为Haxe。
- 如有必要,请手动清理生成的as3hx代码。
之后,迭代执行以下操作:
- 将您的代码库移植到Haxe,以使用Unity API而不是Flash API。
- C#- Haxe Haxe C#. Haxe, UnityEngine.dll, API hx. Assembly-Csharp.dll C#, .
- Unity.
工作的第一周非常繁琐,您必须清理as3hx标记为不一致的表达式,修复它添加的编译器错误并处理I / O调用。修复Haxe中的错误并不是完美的,所以无论我多么努力,每次尝试构建时都会遇到大约30个错误,因此我不知道在完成所有工作之前,要完成所有错误。另外,在我看来,as3hx是一个搜索和替换翻译器,而不是真正的AST与从AST进行翻译的编译器,因为它似乎会增加一些错误,例如将代码放在括号中的错误一侧。流控制使用特定样式的括号。
完成此操作后,我得到了可以成功编译为C#目标的Haxe代码库。在那之后,我再也没有接触过AS3代码。 (除了下面描述的图形资产导出过程。)至此,我决定放弃Haxe并只使用C#,但尽管as3hx的输出与原始代码非常相似,但在保持花括号样式,代码顺序和注释的同时,Haxe的输出为C#显然不适合人眼。因此,从现在开始,如果我不创建新场景,那么我将编辑Haxe代码并将其编译为C#。
此时,代码已在Unity引擎中编译并运行,但是没有I / O。下一步是使用Unity API重新创建所有I / O代码。此过程和资源转换大约花了四个月的时间,主要是因为Frog Fractions中有许多不同的资源类型:
- 在Flash编辑器中绘制的矢量图形。我将其渲染为4k,迫使AIR制作原始游戏,但是除了渲染动画帧并将其写入PNG文件外,没有做其他事情。然后,我使用TexturePacker将它们组装成精灵板。
- , 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.
除了全屏着色器和视频播放之外,重新制作中的所有内容以及大多数新故事都是使用Graphics.DrawMesh调用呈现的,而不是作为Unity场景图中的对象呈现的。所以问题是,Unity是否真的适合该项目?
当我和Craig Tympani选择Glittermitten Grove的引擎时,我们选择Unity是因为它具有良好的跨平台支持,因为FNA还没有准备好,因为构建自己的引擎是永远不会完成游戏的好方法。最终,虽然我为Unity中差劲的2D支持感到难过,但它却使我们几乎可以毫无问题地发布Mac和Linux版本,在我看来这是巨大的成功。 (大概自2015年以来,Unity中的2D支持有所改善,但是我还没有研究过。Graphics.DrawMesh对我来说效果很好。甚至FNA现在都可以使用资源处理管道了!)
对于这个项目,我主要是出于惯性选择Unity -我不想研究新的引擎,因为我必须执行上述研究项目; Unity支持我想将游戏移植到的所有平台,包括控制台。
哦,然后我创建了一个额外的游戏!我可能会在另一篇文章中讨论这个创作过程,在这里我只提到我在Haxe中整理了一个过渡场景,并用C#编写了新游戏的其余部分。此外,我对Haxe代码库中的主菜单进行了重大更改。因此,在我看来,移植到Haxe之后,很有可能通过在Haxe上进行开发来继续发布代码更新。
我还对原始代码进行了一些优化。故意编写AS3代码时没有考虑效率问题,因为我试图避免争取“完美代码”。例如,我不敢相信我可以在每个算术运算中为堆分配Vector2!结果结果在2012年的计算机上运行良好,但是两次转译后性能最差的部件造成了很大的负担,因此要在现代PC上正常运行,我必须用本机C#重写一些代码。
还值得注意的是,如果我没有计划大幅扩展原始游戏的大小,而只是想与Flash保持一致,那么OpenFL,AIR或Ruffle可能是一个更明智的选择。
发行游戏就像对她说再见。我喜欢在Flash中工作。当时,这是向人们最轻松展示游戏的最好方法,并且看起来他们将永远活着-90年代的SWF仍然可以在最新的Flash播放器中完美运行,即使已经过去了几十年。观看世界时,显然还没有准备好过渡到HTML5的做法令人不快。(坦率地说,情况会变得越来越差,反而会变得更好。我相信,只要两个最受欢迎的浏览器的拥有者拥有自己的手机应用程序商店,该浏览器将永远不会再成为可玩的平台。)他既想出售一款新游戏,又出于保留自己游戏历史的真诚愿望。感谢您和我一起回到她身边!