Unity天坑VFX

  • 坑多没关系,主要是香啊
  • 可以先看看有多
  • 这里是英文版的文档

初始化

  • Package Manager 里下载安装 High Definition RP 高清管线
  • 在弹出的 WizardFix All ,这样就能用了
  • Project 窗口里新建 Visual Effect 文件
  • Hierarchy 窗口里新建 Visual Effect 物体,将文件附上去
  • 双击VFX的文件,打开VFX窗口
  • 编译的按钮在VFX窗口左上角 CompileAuto 按钮开启自动编译
  • 保存是 ctrl + S

程序结构

  • VFX(VisualEffectGraph) 是节点式的,就像 ShaderGraph 一样,使用前需要知道世界的本原
  • ShaderGraph 不同,世界信号是自上向下传输的
  • 世界是由 内容块Context 构成的,内容块分为两种: 绿块(命令块)橙块(执行块) (蓝块无法链接)
  • 绿线接绿口,橙线接橙口
  • 一个健康的粒子需要由以下结构构成
    • 生成块Spawn(绿)
    • 初始化块Initialize Particle(绿转橙)
    • 更新块Update Particle(橙)
    • 渲染块Output Particle(橙)
  • 一个 初始化块 链接一个 更新块 能够构成一个 系统 ,并生成一个虚线框来套在系统上,可以命名
  • 上面这个粒子是没有任何效果的,因为只搭好了结构,里面内饰还没有
  • 右键这些内容块内部,创建一些子节点,这些子节点是树状的
  • 加一点节点,就像这样
  • 所以,正如同老版本粒子系统一样,粒子的基本运动是需要条件的:

    • 发射量【生成块】
    • 生命周期【初始化块】
    • 速度【初始化块或更新块】
    • 渲染方法【渲染块】
  • 这个效果是很多直线上升的点点

搜索节点

  • 在寻找节点时需要输入内容搜索,因为找的话很麻烦
  • 但这么多的节点其实时有规律的,第一个词多半是这些:

    • Add【添加,在原有属性的基础上添加】
    • Set【设置,替换原有属性或属性初始化】
    • Blend【混合,与原有混合】
    • Inherit【继承,延续父类粒子】
    • Multiply【相乘,在原有属性的基础上相乘】
    • Position【空间,在一个区块内计算】
    • Orient【旋转,仅渲染块】
  • 特性词也有这些:

    • Curve【曲线映射】
    • Map【映射计算】
    • Random【随机计算】
    • Collide【碰撞,仅更新块】
    • Force【力场,仅更新块】
    • Kill【消隐区间,区域内粒子清除】

属性类子节点

  • 搜索词太多了,在里面搜索不是什么好主意
  • 不过,在点击某一个子节点时, Inspector 面板会显示它的所有信息
  • 也就是说,所有关于属性修改的节点都可以由调整Inspector面板来调出
  • 它拥有四个下拉菜单:
    • Attribute 是要调整的属性种类,实在太多了
    • Composition 是调整方法,有重载添加相乘混合四种
    • Source 是数值类型,有具体数值继承两种
    • Random 是随机方法,有关闭随机组件范围全局范围三种

注意项

  • 有一些很重要的内容不成体系,但是不知道也不行

坐标系

  • 粒子是有 世界空间world本地空间local 的,默认是本地空间
  • 在本地空间模式下,粒子物体的移动受本地影响,反之不受影响
  • 点击任何橙色内容块右上角来修改全局空间

空间暴露

  • 有一些跟坐标相关的数值会显示一个空间符号,默认是 L ,点击成 W
  • 就能在 Scene场景 里动态修改,这样就不需要锻炼抽象思维了
  • 如果点击了没反应,说明编辑器UI出bug了,重新打开一遍VFX窗口即可

粒子边界

  • 这个东西非常重要,每个粒子的初始化块里都有粒子边界设置
  • 屏幕视角移出粒子边界之后,粒子就直接不显示了,非常的突兀
  • 所以在弄粒子时,粒子边界需要经常去调
  • 所以暴露一下坐标(指 W

发射数量

  • 生成块Spawn 中修改的发射数量是一秒内发射个数,是速度
  • 初始化块Initialize Particle 中修改的发射数量是最大可显示数量,是最大数量
  • 我使用三个例子来解释粒子寿命粒子速度最大数量之间的关系
  • 粒子寿命为1秒时,速度为10时,最大数量如果为5,粒子0.1秒发射一个,吐5下停5下
  • 粒子寿命为1秒时,速度为5时,最大数量如果为10,粒子0.2秒发射一个,持续发射
  • 粒子寿命为0.5秒时,速度为10时,最大数量如果为5,粒子0.1秒发射一个,持续发射

事件入门

  • 有一个内容块比较特殊: Event事件(绿) 内容块

  • 只有一个字符串属性: Event Name ,这里是和代码沟通的属性

  • 实现一个小交互:左键播放,右键停止

  • 首先需要有一个健康的粒子,至少能看到粒子发射

  • 然后链接 Spawn ,修改 Event Name

  • 整一个脚本挂在粒子物体上即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.VFX;//引用命名空间

public class VisualEffectTest1 : MonoBehaviour
{
private VisualEffect visualEffect;//这里是粒子本体

void Start()
{
visualEffect = GetComponent<VisualEffect>();//获得粒子本体
visualEffect.Stop();//一开始保证粒子停止播放
}

void Update()
{
if (Input.GetMouseButtonDown(0))//左键
{
visualEffect.SendEvent("OnPlay");//传递事件信号
}
if (Input.GetMouseButtonDown(1))//右键
{
visualEffect.SendEvent("OnStop");//传递事件信号
}
}
}

渲染内容块

  • VFX里提供了很多渲染块:(甚至展示不全)
  • 在渲染块中,除了属性种类之外,还可以添加一些特殊效果:
    • Camera Fade 摄像机靠近自动消隐
    • Face Camera Plane 始终面向摄像机
    • Subpixel Anti-Aliasing 粒子抗锯齿
    • Screen Space Size 始终保持视野大小(参见Superliminal游戏)
    • Tile/Wrap Positions 越界粒子折返出现
  • 渲染块右键 Convert Output 可以更改渲染块类型

内容块外节点

  • 在内容块以外右键创建节点,会是这样:
  • Context 里就是内容块,带颜色(绿和黄)的那种
  • Operator操纵器,几乎所有的数值计算方法
  • Property自定义属性blackboard 悬浮面板里新建的所有数值
  • System 即内置的粒子模板,很方便
  • Misc 杂项里有分组器,能把一些节点放进去分类

操纵器

  • Attribute 即当前的总输出属性值
  • Bitwise按位运算,用的较少
  • BuiltIn内建属性,有世界物体空间的转换以及一些系统的公有属性
  • Color色彩模型转换
  • Inline内联属性,所有数据类型的形状都在这
  • Logic逻辑运算
  • Math数学运算,只有你想不到的,没有我数学做不到的
  • Noise噪音生成器,有14种
  • Random随机生成器
  • Sampling采样,包含曲线、渐变、贴图的采样
  • Subgraph Operator块中块,块中块得在 Project 里创建
  • Time时间,时间建议直接搜索,更全面
  • Utility实用工具,里面有点缓存加载器

GPU事件

  • 在做GPU事件之前,先得勾选这个:
  • 勾选拓展包之后,有两个变化:
    • Context 中出现 GPUEvent 内容块
    • 更新块Update Particle 中能搜索 Event
  • 使用GPU事件可以让粒子按照时间流程来套娃

  • GPU事件块只能放在更新块

  • 拥有三种事件类型:

    • Trigger Event Always 始终触发
    • Trigger Event On Die 销毁时触发
    • Trigger Event Rate 按速率触发,其中:
      • Over Time 指每秒触发次数
      • Over Distance 指粒子运动距离每超过一米之间的触发次数
  • 在这种粒子套娃的情况下,新的粒子也许会继承之前的粒子的属性,这时可以使用 Inherit

  • 套娃的其他操作与之前类似

拉丝模式

  • 选择 初始化块Initialize Particle(绿转橙) 内容块, Inspector 面板里能选择一个选项: Data Type
  • Data Type 转换为 Particle Strip ,便开启了拉丝模式
  • 初始化块Initialize Particle(绿转橙) 变成了 初始化块Initialize Particle Strip(绿转淡橙)
  • 初始化块链接的更新块也变成了独特的更新块
  • 渲染块要选择独特的拉丝渲染块
  • 可以加一些独特的效果,相当于普通粒子效果里的拖尾

总结

  • 比普通粒子效果要难入门,难度可能凌驾于 ShaderGraph 之上