跳转到内容

粒子系统导出

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 组件:用它的 exportModeShurikenParticle=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 为默认值,不写入产物 JSONif (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/)与实测整理。