作者littleshan (我要加入剑道社!)
看板GameDesign
标题[程式] Unity+ex2D v.s. Corona SDK
时间Mon Jul 23 01:21:53 2012
图文版:
http://goo.gl/dyQNt
Unity 是最近相当受欢迎的游戏引擎,具备了易於非技术人员使用的编辑器、
以及完整的跨平台支援。Corona SDK 则是专注於手机平台上的 2D 游戏引擎,
由於架构简单学习容易,也是手机平台上的热门开发工具。
仅管这两套引擎的规模不同,不适合拿来比较,但若是以「开发手机平台的 2D
游戏」作为前提,我倒是可以从个人经验中做出一些分析。Unity 本身是 3D
引擎,我会以 Unity 加上 ex2D 这套功能强大的 2D plugin 来进行比较。
* * * * * *
基本功能
Unity + ex2D Corona SDK
Sprite ○ ○
Sprite Animation ○ ○
Texture Atlas ○ ○
Bitmap Font ○ △
Unicode Font × ○
2D Primitives × ○
Physics ○ ○
Layer ○ ○
Clipping ○ ○
9-Patch ○ △
Unity+ex2D 与 Corona 都提供了基本的 2D 游戏元素:sprite、texture atlas
与连续图动画等,但其它方面的功能则略有出入,以下针对不同的地方做说明。
Bitmap Font
Bitmap font 意指把字型画到 texture 上,在游戏中若要显示文字,可直接用
texture mapping 的方式显示出来。最流行的工具就是 BMfont,只要指定好字
型,这个小工具可以帮你产生 texture。
ex2D 支援 bitmap font,可以直接读取 BMfont 产生的结果。Corona 并没有
直接支援 bitmap font,但因为它支援 texture atlas,只要自己写一支读取
BMfont 输出档的 Lua script,就能在游戏中显示 bitmap font。而这件事当然
有人做过了,在 Corona 的论坛上可以找到别人写好的 bitmap font 模组。
(只是有些 bug 要自己修正)
Unicode Font
若想使用 bitmap font 显示中文或日文字型,理论上是没问题的,然而这类文
字的字集太大,往往没办法全部画在一张 texture 内。尽管 BMfont 可以处理
unicode font,甚至也能把字型打散画到多张 texture 上,ex2D 却不支援这
种包含多张 texture 的 bitmap font。因此目前 ex2D 无法显示任意的 unicode
文字。
Corona 则具备了呼叫作业系统画出字型的能力。由於 iOS 与 Android 都内建了
unicode 字型,使用作业系统内的字型档不但可以正确显示文字,而且所需要的
记忆体资源也远少於 bitmap font。而且如果对作业系统内建的字型不满意,你
也可以使用自己的 ttf 字型档来画字。
Unity 4.0 将会改进 3.5 的缺点,提供显示 unicode font 的功能。
2D Primitives
Corona 除了画出 sprite 以外,也额外提供了一些常见的 2D 向量图形元件,
包含圆形、长方形、圆角长方形、直线等。当你想快速画出一些简单的图形时
相当有用,而且需要的资源相当少。
ex2D 不提供这样的功能。
Clipping
ex2D 可以针对一群物件设定显示范围,超过范围的部份不会被画出来。若要实
作可卷动的视窗元件,这个功能相当有用。
[感谢 linjack 补充]
Corona 则是使用 bitmap mask 的方式进行 clipping,你可以使用一张灰阶图
片当作显示物件的遮罩。这个遮罩不但可以限制绘图范围,也能够控制触控事件
的范围。
9-Patch
9-Patch 主要用在画出带有边框的元件。这些元件具有不同的大小,在缩放时
只有中间的部份会缩放,边框则需维持原本的宽度。一般来说我们只需要给一
张如左边的图片,并且指定好边框与角落的宽度,支援 9-patch 的系统就可以
画出不同大小的边框。
ex2D 支援 9-patch,只是它把这功能称之为 SpriteBorder;Corona 则没有直
接支援 9-patch。但同样地,你可以把 9-patch 视为 texture atlas,然後自
己写 script 去缩放它,自己实作这个功能花不了太多时间。
记忆体最佳化
由於手机上的记忆体资源相当宝贵,两套 engine 都提供了一些方法来节省记
忆体,但两边的解决方案都说不上良好。
Unity 支援手机上各种常见的压缩格式:PVR、ETC、DXT、ATC 等等,压缩後的
图片占用记忆体量会大幅缩小。然而 Unity 缺少了以下的功能:
1. 自动针对不同的 GPU 载入不同格式的压缩材质。在 iOS 上因为 GPU 全
部都是 PowerVR,所以都用 PVR 格式是 OK 的,但在 Android 上因为使
用的 GPU 各不相同,但一张 texture 却只能选择一种压缩格式,这实在
非常麻烦,良好的 engine 应该帮开发者解决这个问题。
2. 自动针对不同解析度的萤幕载入不同大小的图片。不要说是 Android,在
iOS 上萤幕解析度也是大不相同--从 480x320 到 2048x1536,若要同
时支援 New iPAD 与 iPhone 3GS 将会非常麻烦,尤其 3GS 的记忆体只
有 256MB。
3. 使用递色法(dithering)缩减图片容量。带有透明度(alpha channel)
的图片若使用 PVR 进行压缩,结果往往不甚理想。另一个解决之道是把
图片转成 RGBA4444 的格式,然後藉由递色法让图片品质不致於大幅降低。
虽然 RGBA4444 占用的容量比 PVR 要大,但递色法产生的结果有时比较
能让人眼接受。
Corona 支援上述的第 2 点,也就是针对不同的萤幕解析度去载入不同大小的
图片。但是 Corona 不支援材质压缩,也不支援 RGBA4444 的图片格式。
游戏编辑器
Unity 提供了功能强大的游戏编辑器,即使是没有程式背景的美术人员也可以
操作编辑游戏中的物件,这对於设计关卡或编排 GUI 来说相当方便。
Corona 只提供了模拟器让程式设计师预览游戏过程,但官方网站已宣布他们即
将推出 GUI 编辑器。
我个人对於整合式的游戏编辑器抱持比较保留的态度。诚然 Unity 的编辑器超
级强大,而且还可以定义自己的 asset、设计自己的 asset 编辑器。但另一方
面也导致光看程式码无法理解游戏架构的现象。若想要在 Unity 中写出易读易
维护的程式,可需要下一番功夫。
其它功能
Corona 提供了许多手机游戏的常见功能,包括社群网路整合(Facebook、
GameCenter、OpenFeint)、行动广告、In-app Purchase 等等。
Unity 仅内建 GameCenter,其它功能需要透过 plug-in 的方式来扩充。
价格
Unity (Pro) Corona SDK
iOS 400 (3000) 199/year
Android 400 (3000) 199/year
ex2D 25 –
Prime31 50~200 –
全部 875~1025 (4575~4725) 349/year
Unity 分为普通版与专业版,普通版可以免费使用,但若要制作手机游戏就
必须额外加价,iOS 与 Android 平台各为 400 美金。Unity 专业版本身则
是 1500 美金,但也不包含手机平台,若要再加入手机平台的专业版功能,
则一个平台要再加 1500 美金。
Unity 专业版所提供的额外功能大多以 3D 游戏为主,因此普通版加上 ex2D
即可满足 2D 游戏的需求。但若还要购买其它手机游戏的常见功能:Facebook
整合、in-app purchase、行动广告等 plug-in,大约需要 50~200 美金左右。
相较之下,Corona 的价格显得相当平易近人。它使用年费制,两大平台都是
199 美金,若两边一起买还可以享有 349 美金的优惠,而且不需再购买
Facebook 等外挂套件。
当然,若使用时间超过三年,Corona 的价格就会超过 Unity 普通版。不过三
年对手机游戏来说可是相当漫长的时间。
缺点
Unity+ex2D 与 Corona 都有一些很严重的缺点,若你有意要使用它们,请先仔
细评估这些缺点对你造成的影响。
Texture Atlas 错乱 (ex2D)
若你有使用 texture atlas,就很容易遇到这个问题。ex2D 中每个 sprite 并
不是以档名去记录它们所使用的图片,而是以数字记录它在 texture atlas 中
的编号。如果你先编辑好场景,之後又去修改 texture atlas 改变了编号,那
麽往往会导致场景中的 sprite 错乱。
这问题可说是相当致命,因为 texture atlas 不太可能一开始做好就不动了,
通常每隔一段时间都会有新的图片加进去,旧的图片也可能会因应企划需求而
改变大小,每次更改都需要以人力确认所有场景与 prefab 中的 sprite 保持
正确的内容,浪费相当多的时间。
ex2D 的作者目前正试图在架构上改善这个问题,但尚未有预定的解决时间。
无法扩充 (Corona)
Corona 并没有 plugin 的机制,无法针对它不支援的功能进行扩充。尽管它的
功能对手机游戏来说是足够的,但企划如果不会异想天开,他就不叫企划了。
对於需要额外扩充功能的开发者,Corona 提供了 enterprise license,但价格
需要直接与他们洽谈,我不认为这价格会适合个人开发者或小型团队。
不支援 APK Expansion File
Google Play 有 50MB 的上架限制,APK 档案必需小於 50MB。对於大容量的游
戏,Google 提供了 expansion file 的方式,除了 APK 以外开发者可以另外
上传两个 expansion file,这两个档案将在玩家下载游戏时一并下载。
Unity 和 Corona 在 build 时都没有「产生 expansion file」这个功能。Unity
可以使用 asset bundle 把部份资源分离出主程式,但是与 expansion file 整
合的过程相当复杂;Corona 则是完全无解。
结语
尽管 Unity+ex2D 与 Corona 都有一些缺点,但不可否认的是它们都很适合快速
开发小型游戏。Corona 的优点是程式架构单纯,而且较便宜,内建功能相当完
整,很适合刚踏入手机游戏的开发者。另一方面,若你非常需要图形化的游戏编
辑器,或是你需要一些 Corona 未提供的功能,那麽 Unity 是你的选择。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 202.39.238.241
1F:推 franknine:感谢分享 07/23 07:38
2F:推 Hevak:对不同GPU那个我还以为是打包者应该要考虑的问题耶? 07/23 08:22
3F:→ Hevak:不过无论如何感谢清楚整理分享 07/23 08:22
Unity 可以在 build 的时候选择不同的材质压缩格式
然後配合 Google Play 的 multiple APK 机制
让玩家在下载时只会载到符合自己硬体的 APK
但这实在不是好方法
因为这些使用不同压缩格式的 APK 必需使用不同的 version code
徒然增加维护成本
而且你也没办法拿去别的商城上架 (ex. Hami、S市集等)
连 Google 都建议你直接把不同的压缩材质包进同一个 APK 中做出通用版本
如果要做出所谓通用版本,目前 Unity 比较可行的方法是使用 asset bundle
针对不同的压缩格式产生 asset bundle 後
把 asset bundle 包进 APK 里面
不过这还是会有一些问题就是了
比如说 asset bundle 内的档名不能重覆 (即使不同资料夹)
Unity 其实是个会让人愈用愈生气的东西 XDD
4F:推 fasthall:之前有400元移动开发license免费申请XD 07/23 08:48
5F:推 osanaosana:推 07/23 09:31
6F:推 Hevak:哦哦,懂了,谢谢详细解说XD 07/23 10:38
7F:推 holymars:推推推推推推推推推推推!!!! 07/23 15:41
※ 编辑: littleshan 来自: 220.135.3.139 (07/24 10:20)
8F:推 wangm4a1:推 07/25 01:04