Unity+ex2D V.S. Corona SDK

Unity 是最近相當受歡迎的遊戲引擎,具備了易於非技術人員使用的編輯器、以及完整的跨平台支援。Corona SDK 則是專注於手機平台上的 2D 遊戲引擎,由於架構簡單學習容易,也是手機平台上的熱門開發工具。

僅管這兩套引擎的規模不同,不適合拿來比較,但若是以「開發手機平台的 2D 遊戲」作為前提,我倒是可以從個人經驗中做出一些分析。Unity 本身是 3D 引擎,我會以 Unity 加上 ex2D 這套功能強大的 2D plugin 來進行比較。

基本功能

功能 Unity 3D Corona SDK
Designed for 2D ×
Sprite
Sprite Animation
Texture Atlas
Bitmap Font
Unicode Font ×
2D Primitives ×
Physics
Layer
Clipping
9-Patch

Unity+ex2D 與 Corona 都提供了基本的 2D 遊戲元素:sprite、texture atlas 與連續圖動畫等,但其它方面的功能則略有出入,以下針對不同的地方做說明。

Designed for 2D

很多人可能會認為:2D 遊戲比 3D 遊戲簡單多了,因此使用 3D 引擎來製作 2D 遊戲應該是很輕鬆的工作,但實際上良好的遊戲引擎可以針對 2D 場景進行特化,讓程式設計師更輕鬆。

Corona 針對 2D 場景增加了以下的功能:

  1. 場景中的物件並沒有 Z 值,取而代之的是所有物件就像繪圖軟體中的圖層那樣有前後順序,而且可以直接往前或往後移動。這樣做的好處是物件在往前或往後搬移時,程式設計師不需要再去辛苦地計算正確的 Z 值,另一方面在 render 畫面時也不需要再用 Z 值排序,效能上會更好。

  2. Corona 也使用樹狀結構來表達場景,而樹狀結構中的父節點除了會影響子節點的幾何屬性(位置、旋轉、縮放)以外,也能夠影響子節點的透明度。也就是說,如果要讓一群物件全部變成半透明,只需要設定其父節點的 alpha 即可。由於 2D 遊戲經常改變物件的透明度,這項設計可以大幅簡化程式碼。

ex2D 提供 Layer Manager 來幫助使用者管理 Sprite 的 Z 值,也就是第一點提到的功能,但不提供第二個功能,因此在設定一群物件的透明度時會比較麻煩。此外在 render 時仍然需要排序,這點可能會造成一些效能上的問題。

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 的功能。然而若使用 GUI.Label 來顯示文字,這些文字會強制顯示在所有物件的前面。

2D Primitives

Corona 除了畫出 sprite 以外,也額外提供了一些常見的 2D 向量圖形元件,包含圓形、長方形、圓角長方形、直線等。當你想快速畫出一些簡單的圖形時相當有用,而且需要的資源相當少。

Clipping

ex2D 可以針對一群物件設定顯示範圍,超過範圍的部份不會被畫出來。若要實作可捲動的視窗元件,這個功能相當有用。

Corona 則是使用 bitmap mask 的方式進行 clipping,你可以使用一張灰階圖片當作顯示物件的遮罩。這個遮罩不但可以限制繪圖範圍,也能夠控制觸控事件的範圍。(感謝 ptt 板友 linjack 補充)

9-Patch

9-Patch 主要用在畫出帶有邊框的元件。這些元件具有不同的大小,在縮放時只有中間的部份會縮放,邊框則需維持原本的寬度。一般來說我們只需要給一張如左邊的圖片,並且指定好邊框與角落的寬度,支援 9-patch 的系統就可以畫出不同大小的邊框。

ex2D 支援 9-patch,只是它把這功能稱之為 SpriteBorder;Corona 則沒有直接支援 9-patch。但同樣地,你可以把 9-patch 視為 texture atlas,然後自己寫 script 去縮放它,自己實作這個功能花不了太多時間。

遊戲編輯器

Unity 提供了功能強大的遊戲編輯器,即使是沒有程式背景的美術或企畫人員也可以操作編輯遊戲中的物件,這對於設計關卡或編排 GUI 來說相當方便。

Corona 只提供了模擬器讓程式設計師預覽遊戲過程,但有一些第三方的工具如 Level Helper 可以讓美術或企畫人員使用。

我個人對於整合式的遊戲編輯器抱持比較保留的態度。誠然 Unity 的編輯器超級強大,而且還可以定義自己的 asset、設計自己的 asset 編輯器。但另一方面也導致光看程式碼無法理解遊戲架構的現象。若想要在 Unity 中寫出易讀易維護的程式,可需要下一番功夫。

其它功能

Corona 提供了許多手機遊戲的常見功能,包括社群網路整合(Facebook、Game Center)、行動廣告、In-app Purchase 等等。除此之外,Corona 還整合了自家的 Corona Cloud 服務,提供雲端備份、多人連線、push notification 等等非常豐富的社群網路功能。

Unity 僅內建 Game Center,而 Facebook 則在未來的規畫之中。其它功能如行動廣告或 In-app Purchase 則需要另外購買 plug-in 來擴充。值得一提的是 Corona Cloud 並沒有限制一定要搭配 Corona SDK 使用。若是自行撰寫 Unity plug-in,也可以在 Unity 中使用 Corona Cloud 的功能。

價格

版本 價格
Unity 免費
Unity Pro 3000~4500
Unity Pro Subscription 150~225 per month
Corona Starter 免費
Corona Pro 599 per year
Corona Enterprise 999~2499 per year

Unity 分為普通版與專業版,普通版可以免費使用,也可以開發手機平台遊戲。專業版本身則是 1500 美金,但不包含手機平台,若要再加入手機平台的專業版功能,則一個平台要再加 1500 美金。

Unity 專業版所提供的額外功能大多以 3D 遊戲為主,因此普通版加上 ex2D 即可滿足 2D 遊戲的需求。但若還要購買其它手機遊戲的常見功能:社群網路整合、in-app purchase、行動廣告等 plug-in,大約需要 50~200 美金左右。

Corona 也提供了免費版本,除了某些特定功能外,免費版已經可以製作並在手機上執行遊戲。至於專業版則使用年費制,一年為 599 美金包含多數手機遊戲功能(Facebook、in-app purchase 等)。

另外,如果你的遊戲必需呼叫系統上的特定 API,就需要遊戲引擎開放 native API。在 Unity 上需要使用專業版才能呼叫 native API,價格大約是 3000~4500 美金之間(視需要支援的平台而定)。至於 Corona 則在企業版提供了 native API,其年費為 999 美金,包含完整的技術支援服務的方案則是 2499 美金。

最近 Unity Pro 也開始提供了訂閱制的付費方式,包含手機平台是每個月 150~225 美金。若是短期使用也可以考慮採用訂閱制。

缺點

Unity+ex2D 與 Corona 都有一些很嚴重的缺點,若你有意要使用它們,請先仔細評估這些缺點對你造成的影響。

Texture Atlas 錯亂 (ex2D)

若你有使用 texture atlas,就很容易遇到這個問題。ex2D 中每個 sprite 並不是以檔名去記錄它們所使用的圖片,而是以數字記錄它在 texture atlas 中的編號。如果你先編輯好場景,之後又去修改 texture atlas 改變了編號,那麼往往會導致場景中的 sprite 錯亂。

這問題可說是相當致命,因為 texture atlas 不太可能一開始做好就不動了,通常每隔一段時間都會有新的圖片加進去,舊的圖片也可能會因應企劃需求而改變大小,每次更改都需要以人力確認所有場景與 prefab 中的 sprite 保持正確的內容,浪費相當多的時間。

ex2D 的作者目前正試圖在架構上改善這個問題,但尚未有預定的解決時間。

記憶體最佳化

由於手機上的記憶體資源相當寶貴,兩套 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+ex2D 與 Corona 都有一些缺點,但不可否認的是它們都很適合快速開發小型遊戲。Corona 的優點是程式架構單純,而且較便宜,內建功能相當完整,很適合剛踏入手機遊戲的開發者。另一方面,若你非常需要圖形化的遊戲編輯器,或是你需要一些 Corona 未提供的功能,那麼 Unity 是你的選擇。

參考連結

Changelog

2013-05-29

  • 修正價格比較

2013-05-07

  • 修正價格比較
  • 增加 2D 場景架構比較
  • 加入 Corona Cloud
  • 修正 Unity 對 Unicode 文字支援
  • 增加 Corona 第三方工具 Level Helper
分享到 評論