【转载】UE4 Niagara Visual Debug

346 阅读6分钟

原文链接:UE4 Niagara Visual Debug

临近春节分享一些个人研究 Niagara 的时候用到的一些数据 Debug 方法吧,因为个人感觉在 UE5 真正面世之前,Niagara 虽然已经内嵌了很多高级的计算节点(比如环境感知功能需要的 Sphere Trace Distance Field GPU),高阶 Niagara 粒子效果的制作离不开这些节点,但是某些节点要真正理解并加以运用到实际效果中还需要花时间去消化每一个选项的具体作用,虽然官方在多次直播都有介绍这些节点的功能,但是对于初学者来说可获取到的信息还是太有限了,这无疑也是 Niagara 学习路径上的一个障碍,希望在后续的更新会有所改善吧~~

首先 Niagara 粒子较旧版级联粒子系统的比较重要的功能,能通过 自定义 Module 拿到每个粒子的位置信息,然后我们可以用这些信息做一系列的操作,这其实属于 Niagara 比较基础的一个功能,但是当我们尝试去制作一个存在于脑海的比较复杂的效果,实现这个效果需要多个阶段来完成,这样就需要在每个阶段能实时看到每一个存在于场景的粒子的具体信息,让它直接存在在场景里能看得到,而不是在我们脑子里~~ 所以就需要 手动写一个 Module 来显示这些信息,来帮助我们知道这些粒子到底经历了什么,是不是按照我们的想法去正确运行的,如果出现一些奇怪的效果能快速知道是哪里出了问题 ~~ 因为 Niagara 不比蓝图,蓝图能 Debug 的方法太多了~~~ Print StringF9Draw Debug Line 等等~~

所以分享几个 Debug 的办法,其实也很简单

首先我们建立一个 Niagara System

一个空的,取个名字 Visual Debug,什么都没有~~

点击 Emitter State

修改一番,不跟随总 System 的循环周期,让粒子一直存在于场景,不会消失~~

然后 Particle State

取消勾选,Kill Particles When ..... 让粒子不会跟随生命周期消亡~~

接着给个 Spawn Burst Instantaneous 一次生成 200 个,Sphere Location ,粒子生成一个球状~~~

此时假如我们想在场景里有一个 Actor,当这个 Actor 靠近这群粒子的时候,会对距离比较近的粒子产生影响,要怎么做呢~~~

首先 Niagara 点击 Scatch Pad 新建自定义脚本,命名随意,然后用到一个貌似是引擎内置的节点 Distance Based Falloff,嗯~~ 简单翻译过来基于距离的衰减

官方在一期直播的时候其实就用到了这个节点的功能,但是逻辑是官方自己写的,Building advanced effects in Niagara | Unreal Engine,上由关直接能搜到~~

原理就是会有两个 vector3 的输入,StartPositionEndPosition,然后比较这两个位置的距离,当这个距离低于一个值的时候就开始计算衰减的百分比,然后会返回这个百分比和其他相关数据,这里我们写一个逻辑如图

image.png

粒子的位置给 StartPosition,Actor 的位置给 EndPosition,我们让我们的粒子去检测场景里面这个 Actor,然后拿到衰减的返回值用来做 Debug

这里要给一个 Transform Position 是为了修正一些偏差,Niagara 内部是 Simulation Space 场景里面则是 World Space 直接拿进来计算的结果是不匹配的,这个细节 很重要~~

注意把输出的值的命名空间改成 Output,相当于当作一个数据存在于整个 Niagara System,但是不实际影响最终效果,一个只读的数据类型~~

接着新建一个 Blueprint,连连看一段

image.png

公开 Niagara System 然后在场景里选中,接着回到 Niagara System 里面在 User Exposed 新建两个变量

一个 float 一个 vector3

然后在场景里选中 Nia 粒子关联上就行了

image.png

乍一看没变化,是因为还没把返回值用来做 Debug 显示

新增一个 Scale Color,然后切换成曲线输入

然后点击 CurveIndex 的下脚标,输入 Falloff,我们可以看到在上一个 Module 返回的数值能看到

然后选中 Normalized Falloff,让单位化的这个数值来区分不同的颜色

随便改几个颜色,就可以看到场景里面的粒子发生了变化

这样一来自定义模块的返回值就能通过颜色来进行 Debug,表达更直观~~~

这是一种数据 Debug 的方法,但是如果说要实时把数据显示在场景里呢,我们新建一个材质球 M_DebugSprite,然后在材质里面写一个 Debug

我自己加了一个颜色的区分,接着回到 Niagara System 加一个 Dynamic Paramter 接口把数据传递进材质,然后 Niagara Render 进程增加一个 Sprite,把材质给上

然后把参数给上

就能在场景里看到每一个粒子自身的一些数值属性

操作其实很简单,掌握 Niagara 系统的运行机制和数值传递就行,然后拿到这些数值继续做一个大小的控制,新增一个 Scale Sprite Size Module

让距离 Actor 越近的粒子越小,反之越大

然后在场景里面移动一个 Actor 的位置

juejuejue.gif

结果显而易见,这都属于简单的调试的方式其中之一

其实单一的数值调试还是很简单的,用 Color Size 等等最常见的属性来做很寻常,但是如果遇到一个比如 Vector3 类型的值怎么办呢,其实也很简单

直接拿引擎内置的箭头模型然后让 Niagara 发射模型,然后通过把 Vector3 转化成模型的朝向就简单明了了~~~

继续增加一个 Mesh Render,然后新增一个 Orient Mesh To Vector Module,之后把值给上,让箭头的朝向平行于之前得到的一个 Vector 返回值

然后移动 Actor,箭头的朝向就直接代表一个 Vector3 的直观的数据形式

juejuejue.gif

方法很多,比如像一些很复杂的官方节点返回值很多数据都能用一些类似的方法得到一个比较直观的答案~~~

这里是 Wild Wolf ,一名 4 年工作经验的 TA,希望能帮助到还在 Niagara 学习之路的骚年~~~