刀光拖尾功能的改良

年末终于有空,刀光拖尾是我很早就想回顾的一个课题,项目中多采用插件实现,很少有机会去研究。

之前也写过一版拖尾,但效果并不好。

 

在游戏中刀光拖尾有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),

偷懒先用传统方式写入了。

 

最后是刀光消隐的问题,因为每帧都是通过采样点和插值方法重新生成的面片,i/采样数 自然就能拿到前后拖尾的信息,

但每个招式结束时需要对拖尾进行整体消隐,因此需要为拖尾材质球传入整体时间系数;并在shader里做处理

,整体消隐由动画事件控制其插值动画的触发。

 

最终参考该插件完成了刀光拖尾功能的改良,代码Gitee地址:https://gitee.com/Hont/weapon-trail-fx

posted @ 2023-01-17 18:37  HONT  阅读(615)  评论(0编辑  收藏  举报