
粒子效果
中心是一个人物模型,似乎也是由粒子贴片而成的。此外还有一些发光粒子,在无规则运动,不时会撞击到模型上,导致模型裂开成一些粒子。这些散落的粒子被撞击裂开后,会逐渐恢复原先在模型上的位置。
Niagara蓝图部分
蓝图部分给出了两种实现方案:基于GPU粒子的和基于CPU粒子的。本文将会着重解析基于GPU粒子的实现方案。
GPU粒子的实现方案里又有两个粒子发射器,一左一右分别对应无规则运动的发光粒子和组成人物骨骼模型网格的粒子。其中右边的粒子发射器中明显集中了比较多的自定义操作,这也会是我们分析的重点。

此外,另一个需要提前提到的点,就是System Spawn里设置了一个System级别的参数Influencers,顾名思义,就是会对其他粒子产生影响的粒子,这里需要填入该粒子所在的粒子发射器的名字(填了第一个也就是自发光粒子发射器的名字)

效果实现分析
自发光无规则粒子
这个粒子发射器是一个比较常规的粒子发射器。这里做了对每两个Tick间的时间间隔做了一个限制,即防止因为帧与帧的延迟导致的模拟上的问题。这里取了1/60,意味着模拟的是60帧以上的情况,当游戏降到60帧以下时,会采用60帧来进行模拟。

另外可以注意到,这个发射器在粒子里写入了一个属性(SecondSkeletalMeshInfluencerSpriteScale),而这个属性在这个发射器上并没有被用到,不过由它的名字可以知道,它是会作用在其他的发射器的粒子上。

骨架网格体粒子
来到骨架网格体粒子,全称应该是用来重建骨架网格体的sprite粒子。下图可以看出,一下就拿出了3w个粒子来“重建reproduction”这个skeletal mesh。

将粒子拼成骨架网格体的这个模块,就是Initialize Mesh Reproduction Sprite。用User命名空间的属性拿到外部SkeletalMesh,拿到模块里进行采样。勾选Overwrite Intrinsic Variables可以重写Particles里的一些属性。到这里,我们就拿到了一个完全由Sprite粒子组成的小白人。

下面进入让粒子产生交互的部分。
Iterate Over Influencers Inline
Iterate Over Influencers Inline主要是对三个参数和两个属性进行了读写:Transient.CompositedInfluencerVelocity,Transient.NumberofEffectiveInfluencers,Transient.TotalInfluence以及System.Influencers和Particles.Position。其中,那三个Transient变量是不会在帧与帧之间进行传递的,他们的主要作用是在同一帧不同模块间传递信息。

这一模块的脚本蓝图相当之长,其引入的一个新的节点是Map For。前面我们已经接触过Map Get和Map Set,分别是用来获取参数和设置参数的。Map For和Map Set的最大差别在于,Map For是一个循环结构,即它会进行自我循环迭代(相当于代码里的for循环,范围是到上一个Map Set,如果没有的话,则从入口开始循环)(此外,Iteration Count是迭代的总数,至于当前迭代的索引,应该是写在了底层代码里)。我这里做一个拆分,主要是依据Map For里迭代的这些变量,看他们是如何变化的。

Iteration Count代表了总的迭代数,它的取值是直接取到施加影响的发射器中的粒子个数。
Iteration是当前的迭代索引(局部变量),用来记录迭代的进程。
Number of Effective Influencers字面意思是有效影响者的数量,整形;Composited Influencer Velocity字面意思组合影响者的速度,向量;Total Influence意思是总的影响,浮点数。他们三个的值的赋予是通过一个条件判断。

这个条件判断(if语句)的条件如下图。其操作是通过Iteration作为索引取出Influencers中对应索引的粒子中的Position位置和Velocity速度属性,两者分别返回两个布尔值代表是否

本文详细解析了一款游戏中基于GPU粒子的特效实现,涉及自发光粒子的规则模拟和骨架网格体粒子的交互计算,展示了复杂参数如何影响粒子行为及效果的动态调整过程。
最低0.47元/天 解锁文章
762

被折叠的 条评论
为什么被折叠?



