视觉效果图 (VFX Graph) 支持使用基于节点的视觉逻辑创作简单和复杂的效果。VFX Graph 作为 Unity 中提供的几种主要工具集之一,允许艺术家和设计师以很少的编码甚至无需编码即可进行创作。
视觉效果是给玩家带来身临其境体验的关键。而且由于硬件的不断进步,过去只有好莱坞大片才能实现的功能现在可以实时实现。
本文摘录自我们的 120 页电子书《 在 Unity 中创建高级视觉效果的权威指南》,该指南指导艺术家、技术艺术家和程序员使用 Unity 2021 LTS 版本的 VFX Graph。利用它作为参考为您的游戏制作层次丰富、实时的视觉效果。
对于高端平台上复杂的 AAA 级视觉效果,使用 VFX Graph 在直观的基于节点的界面中创建 GPU 加速粒子。
更具体地说,利用 VFX Graph 可以:
创建一个或多个粒子系统
添加静态网格并控制着色器属性
通过 C# 或时间线创建事件来打开或关闭部分效果
通过创建常用节点组合的子图来扩展特征库
在另一个 VFX Graph 中使用 VFX Graph(例如,较小的爆炸作为另一个较大效果的一部分)
预览不同速率的变化和/或执行逐步模拟
VFX Graph 与 通用渲染管线 (URP)* 和 高清渲染管线 (HDRP) 配合使用。它还增加了对 URP 提供的 Lit 输出和 2D 渲染器 的支持。在此处检查所有渲染管道的 VFX Graph 功能比较。
VFX Graph 需要计算着色器支持才能保持与您的设备的兼容性。支持的设备包括:
使用Metal 图形API 的 macOS 和 iOS 平台
具有Vulkan或GLES3API 的 Linux 和 Windows 平台
Android 适用于部分高端计算设备(仅限 URP)
核心图形包
从 Unity 2021 LTS 开始,您可以在项目中有效地安装 VFX Graph。核心图形包现在嵌入在主 Unity 安装程序中,以确保您的项目始终运行在最新的、经过验证的图形代码上。
当您安装最新版本的 Unity 时,URP、HDRP、Shader Graph、VFX Graph 等最新的软件包都会包含在安装中。
有关详细信息,请参阅 开始使用 VFX Graph 或阅读 此博客文章。
* 对于 Unity 2021 LTS 及更高版本,只有 HDRP 才可以访问相机缓冲区。详细了解 VFX Graph 的兼容性文 档。
VFX Graph 中的任何视觉效果都由以下两部分组成:
附加到场景中的游戏对象的视觉效果 (VFX) 组件
位于项目级别的视觉效果 (VFX) 图形资产
由于 Unity 将每个 VFX Graph 存储在 Assets 文件夹中,因此您必须将每个资产连接到场景中的 Visual Effect 组件。请记住,不同的游戏对象在运行时可以引用同一个图表。
要创建新的视觉效果,请在 项目 窗口中单击鼠标右键,然后导航至 “创建”>“视觉效果”>“视觉效果图形”。这会产生 VFX Graph Asset。
Unity 提供了几种将 VFX Graph Asset 连接到具有 视觉效果组件的游戏对象的 方法:
将生成的资产拖入场景视图或层次结构中。一个新的默认游戏对象 (GameObject) 将出现在层次结构 (Hierarchy) 窗口中。
将资产分配给检查器中现有的视觉效果组件。单独创建一个GameObject并使用添加组件菜单。
选择一个游戏对象 (GameObject),将资产拖放到检查器 (Inspector)窗口中。这将创建视觉效果组件并通过一个快速操作分配资产。
VFX Graph Asset 包含所有逻辑。选择下列方法之一来编辑其行为:
- 在项目窗口中双击VFX Graph Asset。
- 在项目窗口中选择VFX Graph Asset,然后单击标题中的打开按钮。
- 单击视觉效果组件中资产模板属性旁边的编辑按钮。
该资产在 VFX Graph 窗口中打开,该窗口位于 窗口 > 视觉效果 > 视觉效果图形下。
熟悉 此窗口的布局,包括其:
工具栏:访问全局设置以及多个面板的切换
节点工作区:创作和编辑 VFX 图形
黑板: 管理整个图形中可重复使用的属性和全局变量
VFX 控制面板: 修改附加游戏对象上的播放
确保在编辑器布局中为检查器留出一些空间。选择图表的一部分可以显示某些参数,例如分区选项和渲染状态。
在上图中,您会注意到空粒子系统图中存在四个上下文。
上下文之间的流动决定了粒子如何产生和模拟。每个上下文定义一个计算阶段:
生成: 确定应创建多少个粒子以及何时生成它们(例如,一次爆发、循环、延迟等)
初始化:确定粒子的起始属性,以及容量(最大粒子数)和边界(效果渲染的体积)
更新: 每帧更改粒子属性;在这里您可以应用力、添加动画、创建碰撞或设置一些交互,例如使用有符号距离场 (SDF)
输出: 渲染粒子并确定其最终外观(颜色、纹理、方向);每个系统可以有多个输出,以实现最大的灵活性
系统和上下文构成了图表“垂直逻辑”或 处理工作流程的骨干。系统中的数据从上到下向下流动,沿途遇到的每个上下文都会根据模拟修改数据。
系统是灵活的,因此您可以根据需要省略上下文或将多个输出链接在一起。
上下文本身的行为根据其各自的块而不同,这些块同样从上到下计算数据。您可以添加和操作更多块来处理该数据。
单击情境右上角的按钮可在系统的模拟空间 “本地” 和 “世界”之间切换。
请参阅 节点库 以获取上下文和块的完整列表。
块几乎可以做任何事情,从简单的 颜色值存储,到诸如 噪声、 力和 碰撞等复杂操作。它们通常在左侧有插槽,可以在那里接收来自操作员和属性的输入。
正如系统构成了图表的大部分垂直逻辑一样,操作符构成了其 属性工作流的“水平逻辑”。它们可以帮助您将自定义表达式或值传递到您的块中。
操作符从左到右流动,类似于 Shader Graph 节点。您可以使用它们来处理值或执行一系列计算。
使用 创建节点 菜单(右键单击或按空格键)创建 操作员节点。
属性是使用 属性工作流连接到图形元素的可编辑字段。属性可以是:
任何类型,包括整数、浮点数和布尔值
由复合组件组成,例如矢量和颜色
强制转换(例如,将整数转换为浮点数)
本地或世界空间;单击L或W在它们之间切换
属性值会根据图表中的实际值改变。您可以将输入端口(属性左侧)连接到其他图形节点。
属性节点 是一种运算符,它允许您在图中的各个点 重复使用相同的值 。它们具有在黑板上显示的相应的全局属性。
一个名为 Blackboard 的实用程序面板管理全局属性,这些属性可以作为属性节点在整个图形中多次出现。
Blackboard 中的属性包括:
暴露:任何公开属性左侧的绿点表示您可以在图表外部查看和编辑它。使用暴露属性类通过脚本访问检查器中的暴露属性。
持续的:没有绿点的黑板属性是常量。它可以在图内重复使用,但不会出现在 Inspector 中。
默认情况下,新属性是公开的,因此会出现在检查器 (Inspector) 中。如果您想隐藏图表之外的属性,则必须取消选中 “公开” 选项,并创建 类别 以保持属性井然有序。
随着图形逻辑的增长,使用组节点和 便签 来减少混乱。使用组节点,您可以标记一组节点并将它们作为一个节点移动。另一方面,便签的操作类似于代码注释。
要创建组节点,请选择一组节点,右键单击它们,然后从 上下文 菜单中选择 “组选择”。您还可以按住 Shift 键将节点拖出到现有的组节点中。通过使用 Delete 键或从上下文菜单删除组节点,您不会删除其包含的节点。
同时,您可以使用便签来描述图表某个部分的工作方式,并为您自己或您的队友留下评论。根据需要添加任意数量的便签,并自由移动或调整其大小。
子图显示为单个节点,这有助于理清图形逻辑。使用它将您的 VFX Graph 的一部分保存为单独的资产,您可以将其放入另一个 VFX Graph 中进行重组和重用。
要创建子图,请选择一组节点,然后从鼠标右键菜单中选择 “转换为子图操作符”。将资产保存到磁盘并将节点转换为单个 子图节点。您可以将系统、块和操作员打包成不同类型的子图。
创建子图类似于重构代码。正如将逻辑组织成可重复使用的方法或函数一样,子图使 VFX Graph 的元素更加模块化。
VFX Graph 支持三种不同级别的编辑:
资产实例配置:使用此功能可以修改任何现有的 VFX Graph。设计师和程序员都可以调整检查器中公开的参数来调整效果的外观、时间或设置。艺术家还可以使用外部脚本或事件来改变预先创作的内容。在这个层面上,你将每个图表视为一个黑匣子。
VFX 资产创作:这是您的创造力真正能够发挥作用的地方。构建操作员节点网络来开始制作您自己的 VFX Graph,并设置自定义行为和参数来创建自定义模拟。无论您是根据现有样本还是从头开始,您都可以获得特定的效果。
VFX 脚本: 这支持更有经验的技术艺术家或图形程序员使用组件 API来定制 VFX Graph 的行为。通过 VFX 脚本,您的团队可以享受更高效的管道来管理特定效果,并访问图形缓冲区等高级功能。
属性是您可能在系统中使用的数据,例如粒子的颜色、粒子的位置或您应该生成多少个粒子。
使用节点读取或写入属性。特别是使用:
获取属性操作符以读取粒子或粒子条系统中的属性
实验性的Spawner 回调用于读取Spawn 系统中的属性
设置属性块以将值写入属性;直接设置属性的值或使用随机模式(例如,使用随机渐变或随机每个组件块设置颜色属性)
请参阅 文档 以获取完整的属性列表。
笔记:系统仅在需要时才存储属性。为了节省内存,它不存储任何不必要的数据。如果您读取 VFX Graph 没有存储来自属性的模拟数据,则属性将传递其默认常量值。
VFX Graph 的各个部分通过 事件相互通信(以及与场景的其余部分通信)。例如,每个 Spawn Context 包含 Start 和 Stop 流端口,它们接收事件来控制粒子生成。
当需要发生某些事情时,外部游戏对象可以使用 C# API的 SendEvent 方法通知图形的各个部分。然后,视觉效果组件将把事件作为字符串名称或属性 ID 传递。
事件上下文 通过 图表内的事件字符串名称或 ID来标识事件。在上面的例子中,场景中的外部对象可以引发 OnPlay 事件 来启动 Spawn 系统,或者引发 OnStop 事件 来停止它。
您可以将 输出事件 与 输出事件处理程序结合起来。如果粒子的初始生成需要驱动场景中的其他东西,则输出事件很有用。这对于将灯光或游戏玩法与视觉效果同步很常见。
上面的例子将 OnReceivedEvent 发送到图表之外的 GameObject 组件。然后,C# 脚本将做出相应的反应,增强光或火焰、激发火花等。有关输出事件的更多信息,请参阅 VFX Graph 电子书 的交互性部分。
同时,您可以使用 GPU 事件 根据其他粒子行为产生粒子。这样,当一个系统中的粒子死亡时,您可以通知另一个系统,从而产生有用的连锁反应,例如,射弹粒子在死亡时会产生灰尘效果。
这些 更新块 可以通过以下方式发送 GPU 事件 数据:
芯片触发事件:当粒子死亡时在另一个系统上产生粒子
触发事件发生率: 每秒产生粒子(或根据其速度)
始终触发事件:每帧产生粒子
块的输出连接到 GPU 事件上下文,然后可以通知依赖系统的 初始化上下文 。以这种方式将不同的系统链接在一起有助于您创建丰富细致且复杂的粒子效果。
GPU 事件系统的初始化上下文还可以继承触发事件之前在父系统中可用的属性。因此,例如,通过继承其位置,新粒子将出现在与产生它的原始粒子相同的位置。
使用 事件属性有效负载 将诸如 3D 位置或颜色之类的数据与事件一起传递。这些有效负载携带着隐式地穿过图表的属性,您可以在其中“捕获”操作员或块中的数据。
您还可以读取通过 Spawn Events 或 Timeline Events传递的属性。设置 SpawnEvent 属性块 修改 Spawn Context 中的事件属性。
要在初始化上下文中捕获有效负载,请使用 获取源属性运算符 或 继承属性块。
但是,使用事件属性时务必牢记以下注意事项:
常规事件属性只能在初始化上下文中读取。您不能在更新或输出中继承它们。要在以后的 Context 中使用该属性,必须继承并在 Initialize 中设置它。
输出事件属性仅携带在 Spawn Context 中设置的初始值。它们没有捕捉到图表中稍后发生的任何变化。
有关更多详细信息,请参阅视觉效果组件 API 中的 发送事件 。
VFX Graph 不仅仅是其各个部分的总和。它需要对如何应用节点和操作符以及它们协同工作的方式有深入的理解。
包管理器中的 VFX GraphAdditions 演示了几个简单的图表,使它们成为学习如何管理粒子的良好起点。
以下部分向您介绍在探索所提供的示例时会遇到的一些常见块和运算符。
动画纹理可以创造奇迹,使您的效果更加可信。从外部 数字内容创建 (DCC) 工具或 Unity 内部生成这些。使用 Operators 来管理 Flipbook Block。
有关在 Unity 中创建自己的 Flipbooks 的更多信息,请查看 VFX Graph 电子书的 VFXToolbox 部分中的 图像序列器 。
获取免费电子书
我们的 120 页电子书 《在 Unity 中创建高级视觉效果的权威指南》指导艺术家、设计师和程序员使用 Unity 2021 LTS 版本的 VFX Graph。本书由专家编写,可作为参考资料,帮助您为游戏制作层次丰富、实时的视觉效果。