1. 程式人生 > >【博物納新】2D破碎效果開源庫測評

【博物納新】2D破碎效果開源庫測評

【博物納新】是UWA重磅推出的全新欄目,旨在為開發者推薦新穎、易用、有趣的開源專案,幫助大家在專案研發之餘發現世界上的熱門專案、前沿技術或者令人驚歎的視覺效果,並探索將其應用到自己專案的可行性。很多時候,我們並不知道自己想要什麼,直到某一天我們遇到了它。

導讀

Unity 2D Destruction能幫助你快速實現2D元素的破碎效果,它是一個完全開源、精簡易用的工具,作者提供了教學視訊可以幫助你更快地使用它。

效果展示

請輸入圖片描述

使用步驟

1.首先放置一個2D Sprite在場景中,新增一個Collider,比如Polygon Collider 2D,並去除Collider網格中自動生成的不必要頂點,讓它看上去更合理一些(這裡建議使用Collider2D Optimization小工具做自動頂點優化)。這裡Collider網格的頂點會作為後續破碎效果的分割點。

2.給這個Sprite新增一個Explodable元件,它就是使Sprite可以破碎的關鍵指令碼。請輸入圖片描述 3.設定Explodable引數

  • Shatter Type:選擇破碎的形狀,Triangle或Voronoi。

請輸入圖片描述

  • Allow Runtime Fragment:開啟遊戲執行時碎片機制。
  • Extra Points:除Collider網格頂點之外的補充分割點,分割點越多,碎片越小。
  • Subshatter Steps:對子網格進行二次破碎效果。例如,如果將其設定為2,則您的精靈將被分塊,然後每個片段將再被分塊,然後這些片段將再次分段。一般不建議將其設定為2以上,通常1就足夠了。
  • Fragment Layer:設定碎片的Layer。
  • SortingLayer:設定碎片的Sorting Layer。
  • Order In Layer:設定碎片的Order in Layer。

這裡需要注意的是第一個選項,由於在執行時實時計算碎片形狀會造成比較明顯的CPU開銷,因此不建議開啟,以防造成執行卡頓的現象。

最後三項對於Layer的設定可以幫助你實現以下情景:希望破碎的碎片可以掉落到地面下;希望破碎的碎片不受其他元素(如子彈)影響;

最後還有兩個淺顯易懂的功能按鈕,幫助你更便捷地操作使用它:

  • Generate Fragments:生成碎片。
  • Destroy Fragments:銷燬碎片。

4.新增ExplodeOnClick指令碼,使Sprite被點選時,觸發破碎效果。至此,破碎效果就已經完成了。

擴充套件功能

作者提供了一個ExplodableAddon抽象類,會在Fragment會生成時自動呼叫這裡的OnFragmentsGenerated方法,開發者可以自行繼承這個類,對破碎效果進行功能擴充套件。

如工程中的Explodable Fragments就是一個使用範例,在Sprite上新增這個指令碼,可使碎片發生二次破碎效果。

請輸入圖片描述

效能測試

UWA慣例,使用UWA GOT Online對這個效果進行一下效能測試。

準備幾個測試對比版本:請輸入圖片描述 1.版本A:對比版本,不帶Explodable元件的石塊Spritex5; 2.版本B:預生成版本,新增Explodable元件,預先生成Extra Points=20的Fragments的石塊x5; 3.版本C:實時生成版本,新增Explodable元件,實時生成Extra Points=20的Fragments的石塊x5;

得到了如下資料:請輸入圖片描述 從資料可以看出,使用了Explodable元件的版本幀率是明顯有下降的,而使用實時生成碎片方式的版本下降得更明顯。接下來再具體看一下這些開銷主要來自哪裡。

1.邏輯程式碼對比:

2.渲染模組對比:

3.載入模組對比:

從以上資料可以看出:

1.版本C的自身邏輯中有一項SendMouseEvent耗時明顯偏高,這是在點選時實時計算生成大量碎片導致的耗時。 2.版本B和版本C的透明渲染相近,都比版本A高出0.5ms左右,這是由於渲染碎片導致的。 3.版本C的Loading.UpdatePreloading載入耗時則高於另外兩個版本,這是由於在實時生成碎片時會呼叫Resources.UnloadUnusedAssets()方法導致的。

注意事項

1.示例工程使用的是Unity5.3.1f1版本。 2.請注意,由於工具中生成的碎片都是指令碼生成的網格物體,不支援儲存成Assets,因此無法作為Prefab被儲存下來,目前只能通過預先在場景中擺放或實時生成碎片的方式來實現效果。 3.由於測試環境、機型、版本等多項不可控因素,本文的測試資料僅供參考,請開發者自行根據專案及使用情況再做測試。