关闭

Particle System体会

234人阅读 评论(0) 收藏 举报
分类:

Unity的Particle System真是让人又爱又恨,爱的是能做出很多想要的效果,恨的是一些参数未开放,无法在运行时动态调整,同时它的性能也是个问题。


先耐心地看这样一个案例。

需求:在一个不规则多边形区域内生成雾扩散的效果。

要求:雾扩散的范围和浓度需要和设定的值挂钩;雾的颜色可动态改变;雾不能扩散出多边形区域。


拿到这个需求单的时候,我第一个想到的做法是Particle System,因为雾、云、火焰等通常都是用particle实现的。但由于经验不足,没想到后边尽是坑啊~


坑1: Shape相关的参数不能在运行时调整

本来想通过改变shape中的radius等参数来实现emit area的缩放,然而,Unity竟然没有开放相关接口改变这些参数。

解决方法1:

通过不断和需求方协商(或者叫斗争or撕b),决定转换一下思路,用多边形区域的particle浓度来体现数值上的变化。当然,后来因为效果问题,由近一步做了调整,比如在一个区域内设置多个发散点,通过改变StartLifeTime来调整particle覆盖的区域。


坑2: Shape - Mesh发射粒子

通过编辑多边形形状的mesh,将其应用到particle的shape中,即使用Mesh的方式发射粒子。换句话说,就是在mesh上的点or三角面上生成粒子,这样做以后,就能看到一片乌黑的雾覆盖在了一个特定区域内。然而,要实现不同shape-mesh的发射方式,就得针对每个mesh做一个particle system object,而且要根据mesh的不同,搭配不同的参数。

解决方法2:

打算通过uv动画来做雾漂移的效果。(待验证)


坑3: Shape -Mesh粒子数

要和数值吻合,如果要高浓度覆盖一片较大的区域,就需要很多的粒子(MaxParticles 10000 per Particle System),在真机上一跑就卡的不行了!

解决方法3:

打算通过uv动画来取代mesh粒子。(待验证)


坑4: Collision

Unity Manual上也说了,如果要用collision,会很慢,be wise。但我很不明智地尝试使用collision来将粒子限制在一个区域内,性能是个坑。此外,要利用particle collision让粒子在碰到collider以后就消失,需要设置几个参数。1)World 2)Dampen设为1。3)Bounce设为0。4)LifeTimeLoss设为1.

解决方法4:

减少粒子数,或者干脆不要用粒子效果。(也就是还没想出来)


坑5: Collision - mesh collider

我只知道maya中导出的mesh可以只有单面可见,通过设置polygon normal来实现,如normal指向外面就在外部可见。然而,mesh collider也随了mesh的这个特点,如果normal是单面的,collider也只在那一侧有碰撞检测。

解决方法5:

在Maya中重新调整normal方向并导出。


坑6: Particle有规律的出现消失,而非持续发射

解决方法6:

配合调整参数Duration, MaxParticles, EmissionRate,一旦Duration > MaxParticles / Emission Rate就会出现这种情况。


另外,记录一条RGB转Grayscale的公式:

x = R*0.3 + G*0.59 + B*0.11


罗列了一些坑,以儆效尤。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3915次
    • 积分:183
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:5篇
    • 译文:0篇
    • 评论:0条
    文章分类