如何用UE制作矩阵文字瀑布

本文假设你至少玩过一会会儿材质系统和Niagara系统。本文不会从这两个系统该如何访问,界面是如何构成的讲起。
《矩阵文字瀑布》我可真是起名字的天才。效果见视频:视频

最近在学着做游戏特效,一起学习的友人周末发消息问我这个效果怎么做,她扔给我一个月神的直播录播,称看不懂。
我一看,这录播分了好几集,每集两个小时,加起来不说八小时也有六小时,word天啦,这能看吗?这不能看啊,看完我不用睡觉了。于是自己尝试做了一下。
这个实现思路非常直接,我看见月神的UE版本比较老,以至于为了实现这个效果不得不玩弄场景捕获和蓝图。而顺着我的思路来,不用场景捕获,不用蓝图,不需要在多个RT中倒腾,仅需要使用一个Niagara发射器就可搞定一切!通过这个案例,我们亦可以从中窥见UE新的粒子系统的强大灵活与优美!
文字的随机改变
这一部分,我们通过材质来实现。首先,我们将文字做到一张序列贴图里面:

接着,我们在材质中随机切换序列贴图。序列贴图可以使用一个十分方便的内置函数,FlipBook。

看不清楚请右键图片,在新标签页打开。通过对UV做乘法和取小数(frac),可以将文字平铺到网格中,通过FlipBook的第一个输入(Animation Phase)可以控制子贴图的选取。
接下来,需要解决的问题就是文字的随机了!我们试试在Animation Phase上直接给张Noise贴图。你会得到这个效果:

不同的文字被诡异的混合在了一起,当然,如果你喜欢这个效果,那就这样或许也行,如果不喜欢,那么你需要一些额外的处理。造成这个原因的本质在于如果Animation Phase的值变化,就会取到不同的汉字,我们需要同一个单元格内,Animation Phase的值恒定不变。这很容易,因为我碰巧看过B站的一位UP做像素化滤镜。

这一步很好理解,假设我们横向纵向各有8个格子,UV输入是[0,1],乘以8就是[0,8],下取整之后就是{0,1,2,...,7},再加0.5就是{0.5,1.5,2.5,...,7.5},再除以8,{0.5/8,1.5/8,...,7.5/8}。至此,uv区间[0,1/8)被映射到了0.5/8,[1,2)被映射到了1.5/8……连续的UV至此变成孤立的点,且该点刚好位于每个格子中心。
经过格子化处理的Noise连入Animation Phase,效果就出来啦!

让它随机变化只需要再加个panner

文字瀑布状流动
这是最精彩的地方!我们建立一个Niagara粒子系统,并创建一个Emitter。并在Emitter Update区段加入Spawn Rate,使粒子按照固定速度生成,并给一个你喜欢的生成速率。
接下来,在Particle Spawn区段点加号,加入一个这玩意儿

点选这玩意,创建一个Scratch Pad,接下来你将进入Scratch Pad编辑界面。如果你用过Niagara系统,你可能已经发现了,Niagara中的模块不是原子的,你可以双击任何一个模块了解它的内部细节,也可以创建自己的模块。而当你想要创建一个临时使用的模块时,Scratch Pad将是你的选择。
当你做到这一步的时候,你已经很接近Niagara系统的本质了,我们有必要来谈谈这些东西。
Niagara中除了渲染器和发射器之外的其他模块,唯一的使命便是为渲染器提供参数。这些参数包括粒子的位置,朝向,大小,以及其他一切决定一个粒子如何绘制的参数。你可以在左侧面板看到所有的参数。

什么是参数?参数就是一个变量,绿色的是float,黄色的是Vector。紧接着,每个参数前面有一个作用域,例如System,Emitter,Particle
标为Emitter的参数可以在EmitterSpawn,EmitterUpdate区段中修改,每个Emitter拥有一个独立的此变量副本。
标为Particle的参数每个粒子都有一个独立的副本,粒子之间互不干扰,这很好理解,粒子A的Position自然不等于粒子B的Position,但是如果粒子A和粒子B都是由同一个Emitter发射的,那么它们访问一个Emitter变量时,会得到相同的值。此作用域的参数只可在ParticleSpawn,和ParticleUpdate中修改。
标为System的参数同理,在整个System中访问此变量,得到的值都将是相同的。只能在SystemSpawn和SystemUpdate中修改。
值得注意的是,数据流动是单向的!数据沿着System->Emitter->Particle这个路径流动,System作用域中的数据Emitter可以读到,但不能修改,Emitter中的数据Particle中可以读到,但不能修改。
而在渲染器中,你可以看到渲染器如何处使用这些参数

这表示了使用参数Position作为粒子的位置,使用参数Color作为粒子的颜色。我再次强调,参数Niagara系统逻辑的中心,模块唯一的作用是计算出各种参数。
好了,言归正传,开始写模块,我们进入我们刚刚在ParticleSpawn中建立的模块,进行编写。

我们初始化了三个参数,分别表示粒子的流动速度,水平位置和垂直位置。给水平位置以随机值,给垂直位置设置为0,表示粒子始终从上端生成。速度从输入中取得,这样我们就可以在模块外面调整这个值了。
这三个参数并不是常规的粒子需要的参数,不过Niagara灵活之处就在于它不会规定什么叫做常规!当你第一次设置一个不存在的参数时,这个参数会自动创建。
接下来,我们来到ParticleUpdate区段,同样的,创建一个Scratch Pad。开始编写。

可以看到,我们更新了粒子的垂直位置,匀速直线运动,很好理解。值得注意的是我们设置了一个有意思的变量Alive。当你把这个变量设置为False,粒子将被杀死,这里我们杀死移动到最底端的粒子。
接下来,我们要打开Niagara隐藏功能,找到EmitterProperties,打开GPU渲染,固定边界,模拟过程


Enable Simulation Stages需要点开底部的小三角才能找到,这是一个实验性功能,十分的强大。
(先写到这里,睡觉了,下次接着写)