跳转到内容

粒子系统导出

LayaAir 拥有 GPU、CPU、VFX 三套互补共存的粒子系统,覆盖全场景需求:

GPU
GPU 粒子
GPU PARTICLES
性能 高
功能 低
表现力 一般

GPU 全程驱动,大规模粒子无 CPU 开销,适合海量简单粒子(火花、雨雪、星点等)。

引擎内置
CPU
CPU 粒子
CPU PARTICLES
性能 中等
功能 丰富
表现力 高

对标 Unity Particle System,模块丰富、可编程性强,适合复杂行为与精细特效。

需企业会员 CPU 粒子插件
VFX · 程序化
VFX 粒子
VFX GRAPH
性能 高
功能 程序化
表现力 极高

百万级粒子 + 程序化生成,节点蓝图驱动,表现力极致,适合次世代场景与电影级特效。

需免费 VFX 粒子插件

与 Unity 粒子的导出对应关系:

Unity 粒子LayaAir 粒子系统说明
Shuriken(ParticleSystem 组件)GPU 粒子 或 CPU 粒子随 Export Tool 场景 / 预设导出,两条互斥路径按第一章的规则逐对象决策;第一至五章详述
VFX Graph(.vfx 资产 / VisualEffect 组件)VFX 粒子通过独立的「VFX-SHADER 转换器」把 .vfx 转为 .laya.vfx,不走 Export Tool 场景导出;第六章详述

首步——每个粒子系统按规则确定走 GPU 还是 CPU。 判定按三级优先决定导出模式:

  1. 物体 / 父级挂了 LayaParticleExportSetting 组件:用它的 exportMode(ShurikenParticle=0 / CPUParticle=1)。沿父链向上查找。
  2. 否则自动检测 RequiresCPUParticle:粒子用了 Noise(噪声)/ Trails(拖尾)/ LimitVelocityOverLifetime(速度限制) 任一 → 强制 CPU(这些是 GPU 路径不支持的模块)。
  3. 否则用全局默认:ExportConfig.ParticleExportMode,出厂默认 0 = GPU(Shuriken)。

导出窗口的粒子导出默认模式开关

第 3 级 · 全局默认: 导出窗口「其他设置」里的 Particle Export Mode 开关(Shuriken (GPU) / CPU Particle)——作用于没挂覆盖组件、也未命中自动检测的粒子。

LayaParticleExportSetting 组件

第 1 级 · 手动指定: 给粒子物体加 LayaAir / Particle Export Setting 组件,Export Mode 下拉二选一:Shuriken Particle(GPU)/ CPU Particle。

第 2 级自动切换时,导出会在 Unity Console 打印提示:

[LayaAir Export] 'StaffSwish': 检测到 GPU 不支持的模块 [Noise],自动切换为 CPU 粒子导出。

默认路径——判定为 GPU 时导出 ShurikenParticleRenderer,逐模块映射。 导出组件 _$type: ShurikenParticleRenderer,逐模块映射:main / startLifetime / gravity / emission / shape / velocityOverLifetime / colorOverLifetime / sizeOverLifetime / rotationOverLifetime / colorBySpeed / sizeBySpeed / forceOverLifetime / textureSheetAnimation。

Unity 粒子系统检视器

导出前 · Unity: 粒子系统检视器——持续时间 / 起始生命周期 / 起始速度、发射、突发、形状等模块,逐项导出到 Laya。

渲染模式(renderMode)决定粒子面片如何朝向与成形——面向相机的广告牌、沿速度方向拉伸,或用网格作为粒子。Unity 的渲染模式映射到 Laya 对应值如下:

renderMode值说明
Billboard0默认,永远面向相机。0 为默认值,不写入产物 JSON(if (renderMode != 0) 才写字段)
Stretch1拉伸(带速度方向参数)
HorizontalBillboard2水平面片
VerticalBillboard3垂直面片
Mesh4用网格当粒子(maxParticles × meshVertexCount 即总顶点数)

实测·导出后在 Laya 正确渲染: 一个默认 Billboard + 叠加(Additive)材质的 GPU 粒子,导出前后效果一致。

Unity 中的 GPU 粒子

Unity: 默认粒子系统(Billboard,柔和圆形粒子)。

LayaAir 中的 GPU 粒子

LayaAir: 导出后正常渲染,形态一致。材质产物 "type":"PARTICLESHURIKEN"、materialRenderMode:3(叠加)。

判定为 CPU 时导出 ParticleSystem + Plus* 模块,表达 GPU 路径不支持的效果。 顶层组件 _$type: ParticleSystem,子模块用 Plus 命名(Laya CPU 粒子模块):突发 PlusBurst、曲线关键帧 FloatKeyframe、网格粒子 MeshItem 等。过程中做 Unity→Laya 语义转换,例如突发 cycleCount=0(Unity 的 Infinite)→ Laya -1(Infinite)。CPU 路径能表达 GPU 不支持的 Noise / Trails / 速度限制,代价是 CPU 模拟开销。

实测·导出后在 Laya 正确渲染: 给一个粒子勾上 Noise(噪声) 模块,命中自动检测被转为 CPU 导出,导出前后效果一致。

Unity 中的 CPU 粒子

Unity: 含 Noise 模块的粒子,命中自动检测 → CPU 路径。

LayaAir 中的 CPU 粒子

LayaAir: 导出后正常渲染,形态一致。材质产物 "type":"CpuParticle3D"。

两条路径各对应一种粒子材质类型。 下表按导出情况列出对应的材质 type:

情况函数材质 type
GPU + shader 已注册WriteParticleMaterialPARTICLESHURIKEN
CPU 粒子CPU 路径CpuParticle3D
shader 未注册 + 没开自定义 shaderWriteParticleMaterialGeneric回退内置粒子 shader

各 Unity 粒子模块在两条路径下的支持情况如下。 GPU(Shuriken)只支持广告牌/网格 + 各 over Lifetime 这类,复杂模拟类模块需走 CPU;少数模块两条路径都不支持。

Unity 模块GPU 路径CPU 路径
Noise(噪声)✗✓
Trails(拖尾)✗✓
Limit Velocity over Lifetime(速度限制)✗✓
Inherit Velocity(继承速度)✗✓
Collision(碰撞)✗✓
Force over Lifetime(力)✗✓
Color / Size / Rotation by Speed(按速度变化)✗✓
External Forces(外力)✗✓
Sub Emitters(子发射器)✗✓
Lights(灯光)✗✗
Trigger(触发器)✗✗
Custom Data(自定义数据)✗✗
其余常规模块(发射 / 形状 / 各 over Lifetime…)✓✓

以上第一至五章讲的是 Unity 内置 Shuriken 粒子(ParticleSystem 组件),随 Export Tool 场景 / 预设一起导出。VFX Graph 是另一套体系——Unity 的节点图式 GPU 粒子(.vfx 资产、场景中挂 VisualEffect 组件),LayaAir 对应的是 VFX 粒子系统。本章讲它的导入导出,与前面的 Shuriken 流程完全独立

转换器是插件里独立于 Export Tool 的一个工具窗口,同时负责 VFX Graph 与 ShaderGraph(蓝图)的转换。

  • 菜单入口:LayaAir3D 3.0 / VFX-SHADER Converter,打开「转换器」窗口。

Unity 菜单中的 VFX-SHADER Converter 入口

窗口有单文件和多文件两个页签:

页签用途主要控件
单文件转换转换单个源文件源文件(.vfx 或 .shadergraph,按扩展名自动识别类型)、输出目录(可空,空则输出到源文件同目录)、「转换」按钮
多文件转换递归批量转换整个目录源目录、目标目录、三个转换类型开关(蓝图 / VFX / 应用 prefab 属性覆盖)、「开始批量转换」按钮,保留相对子目录结构

窗口底部是日志区,转换后打印结果、依赖资源拷贝报告与缺失资源清单。

转换器窗口·单文件转换页签

转换器窗口·多文件转换页签

以单个 .vfx 为例(多文件批量同理,只是换成选目录):

  1. 打开转换器:菜单 LayaAir3D 3.0 / VFX-SHADER Converter,切到「单文件转换」页签。
  2. 选源文件:浏览选中要转换的 .vfx 资产;窗口会提示「识别为:VFX(.vfx → .laya.vfx)」。
  3. (可选)设输出目录:留空则输出到 .vfx 同目录。
  4. 点「转换」:插件先扫描资源映射(读 Unity 工程与 VFX/URP 包的 .meta 建 GUID→类映射,并从已导出资源的 Laya 工程侧取纹理 / 网格 / shader 的 uuid),再把 .vfx(Unity YAML)解析、转换、写出 <名称>.laya.vfx(JSON 格式的节点图)。
  5. 收集依赖:转换器从产物里抓出所有引用的资源(res://uuid),在 Laya 资源工程里按 uuid 反查真实文件(网格 / 纹理 / shader),连同 .meta 拷到输出目录旁的 _deps/ 文件夹。
  6. 看日志:日志区列出产物路径、已拷贝的依赖数量,以及找不到的资源清单(多半是还没用 Export Tool 导出的 FBX / 贴图,提示先导出再重转)。

选中源文件后识别为 VFX,转换完成后的日志(产物 + 依赖报告)

转换主产物是一个 Laya .vfx 节点图(JSON 格式),内含上下文、算子、暴露属性等,对应 Laya VFX 粒子系统的图结构。放进 Laya 工程即可使用:

  1. 产物文件名是 <名称>.laya.vfx(.laya 后缀只为避免和同目录的 Unity 源文件 <名称>.vfx 重名)。放进 Laya 工程时去掉 .laya,改回 <名称>.vfx。
  2. 拷进 Laya 工程 assets 目录,在 IDE 里双击打开该 .vfx → 保存一次,编辑器会自动编译出运行时资源(.lvfx + computeshader),无需手动处理。
  3. 导入后,节点图、暴露属性(Blackboard)、图级设置(Initial Event 等)都完整保留:

导入 LayaAir 后的 VFX 节点图与暴露属性

在 LayaAir 中打开转换后的 VFX Graph(节点图 / 图设置 / 控制台)

怎么在场景里播放、用代码驱动? 转换后的 VFX 与 Laya 原生 VFX 完全一致:挂 VisualEffect 组件、事件触发、暴露属性的运行时读写等用法,见 VFX Graph 文档 系列(IDE 操作流程、图级与组件、代码篇)。

转换成品对比(Unity 原版 vs LayaAir)

Section titled “转换成品对比(Unity 原版 vs LayaAir)”

以某治疗特效为例,把贴图 / shader 补齐后,转换产物在 LayaAir 中运行的实际画面与 Unity 原版基本一致——发射形态、十字光符、上升运动、整体观感都得到还原:

Unity 原版运行效果

LayaAir 中转换后运行效果(贴图 / shader 补齐后)

注:图逻辑(发射、模块、曲线、渐变、运动)由转换器自动还原;贴图 / 网格 / 自定义 shader 需按上文方式在 Laya 工程里补齐后,才能得到与原版一致的最终观感。

VFX 转换器把 Unity VFX Graph 的节点图整体翻译成 Laya 的 VFX 节点图,覆盖面较广——上下文、算子、块、曲线渐变、暴露属性都在转换范围内。下面按类别说明支持面。

6.4.1 上下文(Context)与输出类型

Section titled “6.4.1 上下文(Context)与输出类型”

VFX Graph 的系统流程节点(Spawn → Initialize → Update → Output)都能转换,各 Output 类型映射到 Laya 对应的输出上下文:

Unity Output 类型Laya 输出说明
Planar Primitive(含 Lit / URP Lit / HDRP 变体)广告牌面向相机的四边形粒子
Mesh(含 Lit / URP Lit 变体)网格粒子用网格作为粒子
Static Mesh(含 Lit / URP Lit 变体)静态网格粒子与 Mesh 是不同的输出类型
Quad Strip / Particle Strip(含 Lit / URP Lit 变体)拖尾条带 / 拖尾粒子
Cube / Line / Point / Line Strip立方体 / 线 / 点 / 线条带各对应 Laya 同类输出
Composed Particle(组合粒子)组合粒子输出复合拓扑
Decal(URP / HDRP)广告牌(降级)贴花无专用输出,按广告牌近似

其中,若 Output 使用了 ShaderGraph 作为着色(topology 为 Mesh / Quad 且 shading 为 ShaderGraph),网格 / 广告牌输出会升级为专门的「ShaderGraph 网格 / ShaderGraph 广告牌」输出,并绑定由 ShaderGraph 转换出的着色器属性表达式图。

Spawn 块支持 Constant Rate(恒定速率)/ Burst(单次突发)/ Periodic Burst(周期突发)/ Variable Rate(变速率)/ Set Spawn Event Attribute(设置生成事件属性)/ Custom(自定义包装)。

块的映射覆盖了 VFX 常用的绝大多数类别(映射表约 60 余条),主要有:

  • 属性设置:Set Attribute(设置任意粒子属性)、Attribute from Curve(曲线驱动属性)、Attribute from Map、Color over Life(生命期颜色)。
  • 朝向与位置:Orient(朝向,含 Along Velocity / Fixed Axis 等模式)、Position Shape(球 / 盒 / 锥 / 环 / 圆 / 线各形状发射)、Position Mesh / Depth / SDF / Sequential(网格 / 深度 / SDF / 序列位置)。
  • 速度:Velocity Direction / Randomize / Spherical / Tangent(方向 / 随机 / 球面 / 切向速度)。
  • 力场:Gravity(重力)、Drag(线性阻力)、Force(力)、Turbulence(湍流)、Vector Field Force(矢量场力)、Vortex(涡旋)、Conform to Sphere / SDF(吸附到球 / SDF)。
  • 碰撞与消亡:Collision Sphere / AABox / Plane / Cone / Torus / SDF / Oriented Box(各形状碰撞)、Kill Sphere / AABox / Plane / Cone / Torus(各形状消亡区)。
  • 其他:Camera Fade(相机淡入淡出)、Subpixel AA、Tile Warp、Flipbook Play(翻页动画播放)、Connect Target、Screen Space Size、Trigger Event(触发事件)、Custom HLSL(自定义 HLSL 块)。

运算节点覆盖面很广(映射表约 100 条),包括:

  • 数学:加减乘除、取模、取负、绝对值、三角函数(Sin / Cos / Tan)、取整(Floor / Ceil / Round)、幂 / 开方、Min / Max、Clamp / Saturate / Smoothstep、Lerp / InverseLerp / Step、Remap、One Minus、Fractional、Sign、Reciprocal 等。
  • 向量 / 矩阵:Length / Distance / Normalize、点积 / 叉积、Append / Swizzle、Transform Position / Direction / Vector / Matrix、Look At、极坐标 / 球坐标互转。
  • 采样:Sample Curve(曲线)、Sample Gradient(渐变)、Sample Texture 2D / 3D / Cube / 2DArray、Sample Mesh Position / Normal / Tangent / UV / Color / Index、Sample Point Cache、Sample SDF / Bezier。
  • 噪声:Perlin / Value Noise、Curl Noise、Voro Noise。
  • 粒子 / 时间 / 逻辑:Get Attribute、Age over Lifetime、Total Time、Random、Compare / Branch / Switch、Sequential 3D / Line / Circle 等。
  • 属性:Get Property(读取暴露属性)。
  • 曲线(AnimationCurve) 烘成 Laya 曲线的关键帧数据——每个关键帧保留 7 个分量(时间、值、入 / 出切线、入 / 出权重、加权模式),无曲线数据时用 0→1 线性默认。
  • 渐变(Gradient) 把 Unity 分离的颜色键(colorKeys)与透明度键(alphaKeys)按时间点并集重采样、合并成 Laya 的 stops 色标数组([{t, color:{r,g,b,a}}]),内联进 .laya.vfx,不生成独立文件。另有两个后处理:HDR 条带渐变逐键最大值归一、stops 转成 IDE 渐变控件格式(规避 IDE 编译器的一个 bug)。

暴露属性(Exposed Properties)完整保留:VFX 图上的暴露参数会转成 Laya 的 properties,保留暴露名、暴露标志、类型、默认值,还支持分组(m_Category)与数值范围(Min / Max)。默认值按类型处理——纹理 / 网格解析成 uuid、渐变转成 stops、向量 / 颜色给默认值。暴露参数还会参与着色器属性绑定的表达式图。

两个边界:Transform 类型的暴露属性会被跳过;从子图内联进来的参数不算用户暴露属性(不写进 properties)。

转换器的总体策略是尽力转换 + 收集警告 + 缺省填默认,全程零崩溃。需要注意的边界:

  • 坐标系转换:Unity 左手系 → Laya 右手系,位置 / 速度 / 角度等按分量取反。
  • 子图(Subgraph)内联:先展开进主图,再整体转换。
  • 降级处理:Masked 混合模式无对应,降级为 Opaque;Decal 无专用输出,归为广告牌;4 个内置参数(Frame Index / Play Rate / Fixed Time Step / Max Delta Time)无对应,跳过并记警告。
  • 静默跳过(不崩溃):映射表里没有的未知块 / 算子、被禁用(disabled / activation=false)的块、与所在上下文类别不匹配的块,都会被直接跳过;曲线若序列化成非法值(Infinity / NaN,即所谓 broken tangent),整条曲线丢弃、回退为默认曲线。
  • 警告不可见:上述跳过 / 降级多数会记入转换器内部的警告列表,但这些内部警告目前不会显示在转换器窗口日志里——用户在窗口里只能看到资源依赖的缺失报告。因此转换后建议在 Laya IDE 中打开 .laya.vfx 核对效果,确认没有关键节点被静默丢弃。

本页基于插件源码(Editor/Export/vfx/)与实测整理。