UE4 Niagara 相关小贴士

1,336 阅读4分钟

“我正在参加掘金社区游戏创意投稿大赛个人赛,详情请看:游戏创意投稿大赛

Niagara 相关小贴士

如何重命名引脚(Pin)

重命名方法很简单,只要从窗口上右键单击 Pin. 你还可以从这里对 Pin 进行排序和删除。

f: id: PaperSloth: 20180327213107p: plain

如何隐藏 Niagara 发射器和系统的背景

在黑色背景上更容易看清白色粒子的效果。发射器和系统的操作是相同的。

第一步, 打开 Window> Preview Scene Settings

f: id: PaperSloth: 20180327213415p: plain

第二步,你可以通过关闭 Show Environment 来关闭背景

f: id: PaperSloth: 20180327213741p: plain

效果如下所示

f: id: PaperSloth: 20180327213811p: plain

Niagara 节点相关小贴士

接下来,将介绍关于节点的技巧

条件分支

Niagara 有一个 If 节点,但是使用起来有点特殊

f: id: PaperSloth: 20180327214205p: plain

Material 也有一个 If 节点。

f: id: PaperSloth: 20180327214239p: plain

 在 Blueprint 中,则对应的是 Branch

f: id: PaperSloth: 20180327214430p: plain

现在,Niagara 的 If 节点的 特殊之处 在于,你可以选择任何你想要返回的值  

此外,在 Niagara 没有更多或更少的 值比较 节点。

f: id: PaperSloth: 20180327214600p: plain

无论类型设置如何,如果条件为 true,则输出 A 的值; 如果条件为 false,则输出 B 的值。  

特别的是,你可以添加多个输出引脚。乍一看,它看起来很复杂,但结果是一样的,如果为真,输出 A 的值,如果为假,输出 B 的值。

f: id: PaperSloth: 20180327214925p: plain

另外,不像 If 节点,还提供了 boolANDORNOTbit 操作

f: id: PaperSloth: 20180327222430p: plain

自定义的 HLSL 节点

接下来是定制 HLSL 节点。 对于程序员和接触 Material 的人来说,这是一个熟悉的节点。 它是一个让你可以直接写着色器代码的节点。

f: id: PaperSloth: 20180327215257p: plain

在 Material 中它是一个名为 Custom 的节点。

f: id: PaperSloth: 20180327215426p: plain

与 Material 的 Custom 节点不同,它是直接写入节点的  

另外,另一件特别的事情是,这个节点似乎只有一个 void 的返回值。   因此,当需要返回一个值时,它将被分配到 OutputPin 所指定的值

f: id: PaperSloth: 20180327215610p: plain

注释节点

对于那些接触过蓝图和材质的人来说,这是一个非常熟悉的节点。   然而,不幸的是,它没有搭配的 C 键。   这是一个麻烦,但我们可以通过输入 comment 打开节点

f: id: PaperSloth: 20180327215823p: plain

转换节点

介绍的最后一个节点是 Convert 节点,是 Niagara 最有用的节点  

image.png

正如名称 “Convert” 所暗示的,通常用于一些值转换的用途,例如将 Vector 分解为 XYZ

f: id: PaperSloth: 20180327220216p: plain

蓝图当中同样也有类似的

f: id: PaperSloth: 20180327220332p: plain

这个 Convert 节点的强大之处在于,您可以自由定制输入和输出引脚。

例(1) 坐标重组

您可以使用一个节点将 XYZ 重新排列为 YZX

f: id: PaperSloth: 20180327220544p: plain

如果使用的是 Blueprint 的话,则有两个节点

f: id: PaperSloth: 20180327220756p: plain

例(2) 转化为分离的类型

Vector 分解为三个分量

f: id: PaperSloth: 20180327220906p: plain

例(3) 只更新一个轴

两个输入引脚,一个分配给 XY,仅有 Z 可以被一个节点更新,这样是挺方便的

f: id: PaperSloth: 20180327221123p: plain

例(4) 缩短 Min 和 Max

例如,带范围限制的随机数生成,通常在 Blueprint 中是这样的

f: id: PaperSloth: 20180327221428p: plain

Blueprint 的例子如下

f: id: PaperSloth: 20180327221507p: plain

在 Blueprint 中,您可以直接输入该值,因此它可以通过一个节点来实现,但如果你使用 Niagara 的转换(Convert)节点,这样的输入将是智能的

f: id: PaperSloth: 20180327221709p: plain

例(5) 使用多个引脚

因为 Niagara 可以处理矩阵,所以也可以用这种方式创建矩阵。

f: id: PaperSloth: 20180327221903p: plain

这里,只有一个输出引脚,但可以是多个的 —— 作为一个尝试的结果,它没有崩溃,即使我设置输入和输出到 20. (但我通常不会这么做,因为不方便管理这么多引脚)

关于 Niagara 的崩溃问题

Promote to Parameter(提升为参数)的崩溃

在尝试转换一个变量为 Niagara Module Script 的参数时发生崩溃,EdGraphNode.cpp 中的 GetGraph 函数停止了工作。

f: id: PaperSloth: 20180329235945p: plain

查看调用历史,在 NiagaraNodeInput.cpp 中,UNiagaraNodeInputSetDataIninterface 被调用,但是我担心 DataInterfaceInDataInterface 在这个时候是 null 的。

void UNiagaraNodeInput :: SetDataInterface (UNiagaraDataInterface * InDataInterface)
{
	if (DataInterface! = nullptr)
	{
		DataInterface-> OnChanged (). RemoveAll (this);
	}
	DataInterface = InDataInterface;
	if (DataInterface! = nullptr)
	{
		DataInterface-> OnChanged (). AddUObject (this, & UNiagaraNodeInput :: DataInterfaceChanged);
	}
	DataInterfaceChanged ();
}

当 Niagara 系统打开时,关闭编辑器崩溃

编辑器崩溃,但关闭编辑器后,一个崩溃对话框出现,这似乎对工作数据没有特别的影响,所以可能不会有太大的问题。似乎 Renderer 的崩溃与在 NiagaraComponent.cppGetAllocatedSize 的一个无效值有关。

uint32 FNiagaraSceneProxy :: GetAllocatedSize () const
{
	uint32 DynamicDataSize = 0 ;
	 for (NiagaraRenderer * Renderer: EmitterRenderers)
	{
		if (Renderer)
		{
			DynamicDataSize + = Renderer-> GetDynamicDataSize ();
		}
	}
	return FPrimitiveSceneProxy :: GetAllocatedSize () + DynamicDataSize;
}

总结

这里有一些关于 Niagara 的简单小贴士。

Convert 节点非常方便,所以请尽情使用它 !