年終終於有空,刀光拖尾是我很早就想回顧的一個課題,項目中多采用插件實現,很少有機會去研究。
之前也寫過一版拖尾,但效果並不好。
在遊戲中刀光拖尾有2種做法,一種是直接做死,用Shader做遮罩去控制滑動效果,這種做法
通常用於非寫實類項目,unity自己的3d game kit demo對這一塊已經做的比較全,可以直接參考。
第二種是程序化生成,也就是目前的拖尾實現方法。
對於程序化生成的拖尾,通常重新實現一遍TrailRenderer,自行傳入UV信息、擴展插值邏輯等。
如果是直接模仿TrailRenderer去做,折線感會比較明顯,會有一種早期3D遊戲的感覺
我最早的刀光拖尾腳本也是這個基於思路去實現。
資源商店有一個很老的插件X-WeaponTrail,拖尾非常順滑,研究了下發現作者首先記錄每幀刀光點的位置
存爲採樣點,然後根據顆粒度(Granularity)參數進行0-1的插值,插值點再通過距離拿到新的點最終再走一遍CatmulRom輸出,
還是比較細緻的。後來的改良版本基於這個插件的思路去實現。
來對比下改良前後的效果(上圖-舊的刀光拖尾,下圖-新的刀光拖尾):
(上圖的重面問題縮短刀光範圍可以解決)
X-WeaponTrail的做法是每幀記錄最新的刀光點位置,拿到刀光點List通過CatmulRom插值,
並通過距離信息,等距的生成Mesh。每個拖尾面片的頂點位置等信息並沒有進行記錄,而是
實時計算的,這就導致刀光點發生變化之後,插值就會發生變化,就會有奇怪的滾動效果。
當把拖尾拉長後,刀光滾動的問題就比較明顯:
原版插件也有這個問題,不過一般刀光速度很快,這一點來說也還好。
原版插件的頂點處理也比較特殊,經過平滑處理最終寫入網格頂點的數據,是基於縱向3個頂點進行處理的,
也就是每次連接8個三角形(粗看是這樣),這點上沒參考原插件,直接按常規方式繪製頂點和索引順序了,也沒有出現問題。
對於插件的頂點池等功能設計,考慮到unity近年新出的優化方式較多(https://www.cnblogs.com/hont/p/15110254.html),
偷懶先用傳統方式寫入了。
最終參考該插件完成了刀光拖尾功能的改良,代碼Gitee地址:https://gitee.com/Hont/weapon-trail-fx