視頻中萬人同屏方案(gpu動畫、渲染、索敵、避障等功能),可某寶搜店鋪:【游戲開發資源商店】獲取整套方案源碼。
在過去的幾年里,割草、類吸血鬼玩法的游戲頻出爆款,其豐富的技能、滿屏特效、刷怪清屏的解壓暢快是此類游戲的核心,也是技術實現難點。
此類游戲2D居多,如《彈殼特工隊》等,我想其中原因一是硬件性能受限,難以解決移動端3D海量單位同屏;原因二就是海量單位項目視角受限,注定只能是偏俯視遠視角才能在屏幕中展示更多的單位。如果俯視視角3D效果遠不如用2D;
然而2D游戲常用的Spine動畫,性能甚至還不及Animator。在之前的B站視頻中有簡單對比測試:
2d spine動畫幀數提升數十倍?spine轉gpu動畫 2d spine動畫 10w單位
?如何提升spine動畫的性能?
GPU幀動畫:
2d最簡單的方式就是gpu幀動畫,也就是將動畫幀打到圖集里,使用shader進行偏移采樣幀以實現gpu幀動畫。這種方式性能很高,然而過于簡單,只適合簡單需求,如粒子特效等。gpu幀動畫沒有骨骼信息,難以滿足復雜需求,例如弓箭手戰斗單位發起攻擊,通常需要在弓箭手松手的一瞬間,在弓箭發射口創建并發射箭矢,看似極其普通的需求,幀動畫卻無法實現,這就嚴重影響項目品質。

?GPU幀動畫過于簡單,且應用場景受限,不是我們介紹的重點。下面是簡單的GPU幀動畫實現:
?幀動畫Shader函數:
?幀動畫Shader:
?GPU骨骼動畫:
骨骼動畫是使用最普遍的動畫類型,復雜的骨骼節點樹以及無法進行渲染合批導致了嚴重的性能問題。?
Spine動畫是2d骨骼動畫,因此gpu骨骼動畫原理同時適用于2D/3D、無論是人形還是四足,只要是骨骼動畫全部適用。遺憾的是目前無論是開源項目還是Unity資源商店,都沒有一款同時具備高性能、功能完善、易用性、兼容性的GPU動畫插件。
相比之下做的最好的有:
1.?GPU Instancer - Crowd Animations | Animation Tools | Unity Asset Store
?不支持移動平臺,依賴運行時腳本
2.?GPU ECS Animation Baker | Animation Tools | Unity Asset Store
?針對Entities,依賴ECS運行時
?然而,這些都依賴運行時腳本,不僅影響性能,也就注定了受限,因為你無法使用Graphics接口或BatchRendererGroup進行批量合批渲染。這也是我為什么要用純Shader實現GPU動畫的原因,可以不依賴任何腳本,僅僅通過修改shader參數進行動畫切換、融合等。這樣就可以使用單個MeshRenderer渲染動畫物體以支持Unity合批。同時還可以使用Graphics接口或BatchRendererGroup進行批量合批渲染,更進一步大幅提升性能。
?前面的博文中我們已經詳細講過GPU頂點動畫和GPU骨骼動畫的實現原理,并且實現了GPU動畫任意運行時刻獲取任意綁定骨骼的Transform信息,并且支持了動畫事件觸發,使得邏輯行為與動畫保持一致,大大提高了項目品質。此文不再贅述,主要將如何實現控制元素顯隱:
【Unity】GPU骨骼 GPU Spine動畫 2D/3D渲染性能開掛 合批渲染 支持武器掛載 動畫事件 動畫融合 實時獲取骨骼位置_unity spine動畫合批 gpu-CSDN博客
雖然GPU骨骼動畫原理一致,但 2D骨骼動畫(spine動畫)要比3D骨骼動畫復雜很多,因為3D動畫幾乎不會記錄復雜的動畫幀,如節點顯隱等。但是2D動畫非常常用,對于2d spine動畫,人物向不同方向移動就需要顯示不同視角的2D圖片,或者憑空顯示武器、武器特效等。
?對與Animator中修改貼圖的動畫幀,GPU動畫無法做到,但是我們可以把所有元素羅列好,通過Key顯示、隱藏動畫幀達到相同的效果。這樣我們只需讓GPU動畫支持顯示、隱藏功能即可達到預期。
對于GPU動畫支持元素顯示、隱藏有多種方式,如,當GameObject隱藏時可以通過反轉Mesh法線,Shader使用Cull Back就會自動剔除背面以實現Mesh隱藏;然而此方式受限,有些spine動畫通過旋轉Mesh鏡像以實現轉身,這種情況下Shader必須關閉剔除。
還有一種更簡單的方法就是直接修改矩陣縮放,當物體不可見時縮放為0,這樣同樣可以達到Mesh消失的效果。并且本身動畫貼圖中就是寫入的骨骼的矩陣,只需在寫入動畫貼圖前判定骨骼GameObject是否隱藏,隱藏則將矩陣中的縮放置0。
gpu spine動畫效果:
