草庐IT

刀光拖尾功能的改良

HONT blog 2023-03-28 原文

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

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

 

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

有关刀光拖尾功能的改良的更多相关文章

  1. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  2. ruby-on-rails - rails 功能测试 - 2

    在Rails自动生成的功能测试(test/functional/products_controller_test.rb)中,我看到以下代码:classProductsControllerTest我的问题是:方法调用products()在哪里/如何定义?products(:one)到底是什么意思?看代码,大概意思是“创建一个产品”,但是它是如何工作的呢?注意我是Ruby/Rails的新手,如果这些是微不足道的问题,我深表歉意。 最佳答案 如果您查看test/fixtures文件夹,您会看到一个products.yml文件。这是在您创建

  3. ruby-on-rails - 功能测试 Authlogic? - 2

    在我的一些Controller中,我有一个before_filter检查用户是否登录?用于CRUD操作。application.rbdeflogged_in?unlesscurrent_userredirect_toroot_pathendendprivatedefcurrent_user_sessionreturn@current_user_sessionifdefined?(@current_user_session)@current_user_session=UserSession.findenddefcurrent_userreturn@current_userifdefine

  4. ruby - Ruby 中允许 "p *1..10"打印出数字 1-10 的功能是什么? - 2

    require'pp'p*1..10这会打印出1-10。为什么这么简洁?您还可以用它做什么? 最佳答案 它是“splat”运算符。它可用于分解数组和范围并在赋值期间收集值。这里收集赋值中的值:a,*b=1,2,3,4=>a=1b=[2,3,4]在此示例中,内部数组([3,4])中的值被分解并收集到包含数组中:a=[1,2,*[3,4]]=>a=[1,2,3,4]您可以定义将参数收集到数组中的函数:deffoo(*args)pargsendfoo(1,2,"three",4)=>[1,2,"three",4]

  5. ruby - 现代计算机的功能是否不足以处理字符串而无需使用符号(在 Ruby 中) - 2

    我读过的关于Ruby符号的每一篇文章都在谈论符号相对于字符串的效率。但是,这不是1970年代。我的电脑可以处理一些额外的垃圾收集。我错了吗?我拥有最新最好的奔腾双核处理器和4GBRAM。我认为这应该足以处理一些字符串。 最佳答案 您的计算机可能能够处理“一点点额外的垃圾收集”,但是当“一点点”发生在运行数百万次的内部循环中时呢?如果它在内存有限的嵌入式系统上运行呢?有很多地方你可以随意使用字符串,但在某些地方你不能。这完全取决于上下文。 关于ruby-现代计算机的功能是否不足以处理字符串

  6. ruby - 如何在 Cucumber 的功能名称中使用空格 - 2

    我正在使用Windows并尝试运行一个现有的功能包,该功能包最初是在MacOS上构建的,这允许他们通过使用带空格的"\"来解决问题。我正在使用Ruby2.2.3和Cucumber。功能名称包含空格,我无法更改它。我尝试使用""和''来绕过空白,但每次都有同样的问题。这是问题的一个例子。如果我运行:cucumberfeatures/'Namecontainingwhitespaces.feature'它工作正常。但是当我运行时:cucumber-pmy_profile和cucumber.yml包含:my_profile:features/'Namecontainingwhitespace

  7. ruby - 如何测试在运行之间提供功能的 Ruby 脚本? - 2

    单元测试的好方法是测试脚本在执行之间保持正确数据的能力——在使用Ctrl-C终止脚本然后重新运行之后?是否有针对执行类似操作的现有模块或脚本的任何测试可以针对最佳实践进行审查? 最佳答案 像http://avdi.org/devblog/2010/07/19/greenletters-painless-automation-and-testing-for-command-line-applications/一样使用库或者期望、运行、终止并重新运行您的程序,并检查它是否运行正确。好的做法是将程序设计为独立的模块,每个模块都经过良好测试

  8. vue 实现内容超出两行显示展开更多功能,可依据需求自定义任意行数! - 2

    平时开发中我们经常会遇到这样的需求,在一个不限高度的盒子中会有很多内容,如果全部显示用户体验会非常不好,所以可以先折叠起来,当内容达到一定高度时,显示展开更多按钮,点击即可显示全部内容,先来看看效果图: 这样做用户体验瞬间得到提升,接下来看看具体细节。0">主要操作在内容这里{{item.username}},……展开更多样式大家可依据自己项目需求进行设计,这里就不贴了,主要说几个关键的。1、在data中定义三个属性isShowMore:false, //控制展开更多的显示与隐藏textHeight:null, //框中内容的高度status:false, //内容状态是否打开2.计算内容是否

  9. ruby-on-rails - rspec 用户故事功能 vs cucumber - 2

    提前说明一下,尽管标题看起来与线程RSpecvsCucumber(RSpecstories)相似,但是我的问题根本不同。我理解测试用户故事和单独测试对象行为之间的区别。我的问题是,为什么Cucumber通常与RSpec结合使用来编写用户故事,而RSpec从1.1开始就具有用户故事功能?是不是因为RSpec的重点仍然是单个对象测试,而Cucumber自那以后一直在大力开发,重点放在用户故事上?上下文切换是一件痛苦的事情,而我们开发人员需要处理足够多的工具。我宁愿只使用RSpec,但如果Cucumber与RSpec有一些重要区别,请告诉我。 最佳答案

  10. ruby-on-rails - 'starts_with' 和 'start_with' 在 Ruby 中有相同的功能吗? - 2

    显然他们在任何输入上都给我相同的输出,比如"Rubyisred".start_with?("Ruby")或"Rubyisred".starts_with?("Ruby")两者都给出相同的结果。 最佳答案 在Ruby添加String#start_with?作为核心库的一部分之前,Rails的主动支持实现了String#starts_with?方法。现在它只是为了向后兼容而保留的别名。是的-他们做同样的事情,第一个来自Ruby,第二个-来自Rails。 关于ruby-on-rails-'st

随机推荐