关于 roblox-vfx
roblox-vfx 是面向 Roblox 开发者的粒子效果制作与优化技能,提供 ParticleEmitter 属性、形状、动画纹理和渲染控制的指导。内容也涵盖客户端特效、距离剔除、性能分析及瞬时发射器清理。
主要功能
- 01调节粒子外观与运动
- 02配置发射形状和翻页动画
- 03控制光照与渲染效果
- 04分析过度绘制并优化性能
- 05管理客户端发射与效果清理
适用场景
- 01制作环境粒子和一次性爆发效果
- 02为移动设备优化粒子渲染
- 03将特效连接到角色部件或动画事件
- 04按距离控制环境特效并回收发射器
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ nonlooped/ roblox-suite --skill roblox-vfx安装后在 Claude Code 中输入/roblox-vfx确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/particle-emitter-properties.mdshapes-flipbooks-and-advanced.mdscripts/EffectBurst.lua详细介绍
roblox-vfx
主要来源: https://create.roblox.com/docs/en-us/effects/particle-emitters + 文档的 Effects 部分和 ParticleEmitter 类参考。
同时调整粒子生命周期、大小、透明度和发射速率。在最低目标设备上分析重叠透明效果的性能。
对于由标记触发的爆发效果,请阅读 roblox-animation。对于 UI 粒子,请阅读 roblox-user-interfaces;ParticleEmitter 不会在 ViewportFrame 内渲染。
创建与设为父级的核心要点
- 将 ParticleEmitter 设为 BasePart(发射会填满边界范围或所选的 EmissionDirection 面)的子级,或(强烈推荐,便于控制)设为 Attachment 的子级。
- 旋转父级或 Attachment 来控制发射方向。设为 Attachment 的子级时,EmissionDirection 会被忽略;旋转 Attachment 本身来调整粒子方向。
- 只有设为 Part 的子级时,EmissionDirection 才会生效。
调整粒子外观
- 纹理(优先使用带 alpha 通道的 .png;使用灰度图并将 LightEmission 设为 1,以隐藏暗部)。
- 颜色(ColorSequence;即使在 Studio 中只设置一个 Color3,也会存储为只有一个关键点的 ColorSequence;可用于设置粒子生命周期内的渐变)。
- 大小(NumberSequence,通常使用 envelope 实现自然变化)。警告: 尺寸越大,GPU 填充率开销越高。
- 透明度(NumberSequence)。让粒子淡入或淡出,避免突然出现或消失。
- 生命周期(或使用 NumberRange 为每个粒子设置随机值)。
- 发射速率(每秒发射的粒子数;每个发射器的硬性上限约为桌面端 400 个、移动端 100 个;保持较低速率,并通过其他属性实现足够的密度)。
接着调整运动(生成时的 Speed、SpreadAngle、用于模拟重力或风的 Acceleration、启用全局风时使用的 Drag 和 WindAffectsDrag、VelocityInheritance、LockedToPart、TimeScale)。
发射器形状
Shape = Box / Sphere / Cylinder / Disc。
- ShapeStyle = Volume(内部全部区域)或 Surface(仅表面)。
- ShapeInOut = Inward / Outward / InAndOut。
- ShapePartial 可进一步调整形状。Cylinder:发射侧的半径。Disc:内半径比例(
0= 完全闭合的圆盘,1= 仅从外缘发射)。Sphere:半球角度(1= 完整球体,0.5= 半球穹顶,0= 点)。
发射器设为 Attachment 的子级时,Sphere/Cylinder 形状无法正确显示。仅将它们用于设为 BasePart 子级的情况(该 Part 可以非常小且不可见)。
Flipbook(粒子生命周期内播放的动画纹理)
准备一张网格图(2x2、4x4、8x8、Custom),帧与帧之间留出透明间隔(防止 mip 过滤采样到相邻帧)。
- FlipbookLayout、FlipbookSizeX/Y。
- FlipbookFramerate(或使用随机范围,上限为 30)。
- FlipbookMode:Loop、OneShot(爆炸效果;忽略
FlipbookFramerate,并在粒子整个 Lifetime 内恰好播放一次)、PingPong、Random(带交叉淡化;非常适合有机变化)。 - FlipbookBlendFrames:在 Loop/OneShot/PingPong 模式下交叉淡化相邻帧,让动画更流畅。
- FlipbookStartRandom:让每个粒子从随机帧开始(当 framerate 为 0、想要静态但外观各异时很有用)。
内存警告: Flipbook 开销更大。重复使用纹理、保持合理的分辨率,并限制低内存客户端上的独特动画发射器数量(较旧的手机会自动禁用 Flipbook)。
光照与渲染控制
- LightEmission:0 表示普通效果,1 表示叠加/发光效果(即使在黑暗场景中也有效)。
- LightInfluence:0 = 忽略世界光照,1 = 完全受光照影响。
- Brightness:当
LightInfluence为 0 时,缩放发射器贡献的光照强度。LightInfluence为 1 时无效。 - Orientation:FacingCamera(经典公告板效果)、FacingCameraWorldUp、VelocityParallel、VelocityPerpendicular。
- ZOffset:渲染层偏移量,单位为 studs(可叠放多个发射器,而无需在 3D 空间中移动它们)。
不同设备上的性能
- 填充率(重叠透明图层覆盖的像素数)和过度绘制是 GPU 的主要开销。
- 速率 × 尺寸 × 平均不透明度 × 屏幕上重叠的数量 = 开销。
- 始终在 Studio Editor Quality Level 的最低和最高设置下进行测试。
- 移动设备的填充率上限较低。
- 使用 .Enabled = false 暂停(现有粒子会继续存在,直到消失或调用 :Clear())。
- 多个同时运行的高速率、大尺寸、透明发射器会导致引擎在低端客户端上降低性能或丢弃效果。
- 在 Studio 中通过 View → Stats → GPU → Fill Rate 和 Render → Overdraw 测量过度绘制。降低总的不透明像素面积,然后再降低 Rate。
复制与客户端权威发射
- ParticleEmitter 状态会复制,但单个粒子不会。服务器所有的发射器会自动在每个客户端上生成相同的粒子。
- 对于单次爆发效果,优先采用客户端权威发射:服务器发出事件信号,每个受影响的客户端在本地生成爆发效果。这样可以避免复制每次爆发的时序,并遵循每个客户端的画质设置。
- 使用
RemoteEvent:FireClient或本地信号,让客户端负责瞬态视觉效果;游戏逻辑仍由服务器权威控制。
LOD 与距离剔除
- 摄像机距离较远时,停止或降低开销较大的发射器。常见阈值:在 100–300 studs 时禁用,在半程距离时将 Rate 减半。
- 使用
workspace.CurrentCamera距离检测或区域系统。避免对大量发射器逐帧进行Magnitude检查;改用带标签的剔除心跳机制或空间分区。 - 对于环境天气或大型人群,只在摄像机附近区域生成发射器,而不是全局生成。
预加载纹理
- 在需要之前(例如加载画面期间或战斗序列开始前)对翻页动画图集和显眼的效果纹理调用
ContentProvider:PreloadAsync({texture})。这样可以防止低端设备上在爆发效果过程中突然显现。
模式
- 持续环境效果(火焰、烟雾、雨):调整 Rate + Lifetime + Size,使密度在常见摄像机距离下看起来自然。
- 单次爆发效果(爆炸、撞击、枪口闪光):将 Rate 设为较低值或 0,然后从动画标记或事件调用 emitter:Emit(num)。
- 附着效果(脚步尘土、武器拖尾、光环):将发射器或其附件设为移动部件或骨骼的父级。根据需要使用 LockedToPart 或 VelocityInheritance。
- 受风影响的效果:在环境中启用全局风,将发射器的 Drag 设为大于 0,并将 WindAffectsDrag = true。
- 与动画结合:标记 "FootStep" → 查找脚部 Attachment → 调用 Emit 或播放短暂的单次发射器效果。
请参阅 references/ 文件夹(particle-emitter-properties.md、shapes-flipbooks-and-advanced.md),了解完整的属性参考、视觉示例、优化清单,以及常见效果的具体代码(集成内容见 SKILL 和跨技能说明)。
相关效果(常与粒子搭配使用)
- Beam:连接两个 Attachment 的带纹理带状效果(激光、能量、绳索)。主要属性:
Texture、TextureMode/TextureLength/TextureSpeed、Color、Transparency(沿光束变化的 NumberSequence)、Width0/Width1、CurveSize0/CurveSize1、FaceCamera、LightEmission、LightInfluence、ZOffset。 - Trail:两个 Attachment 随父级部件移动时留下的带状效果(剑气、投射物轨迹、残影)。主要属性:
Color、Transparency、Texture、TextureMode、TextureLength、MinLength、MaxLength、WidthScale、LightEmission、LightInfluence、FaceCamera、Lifetime。 - Highlight:开销低、效果出色的轮廓(选中、瞄准、“强化状态”)。同时具有轮廓和纯色内部填充(
FillColor/FillTransparency、OutlineColor/OutlineTransparency)。DepthMode控制高亮是否能穿墙显示(AlwaysOnTop),或仅在未被遮挡时显示(Occluded)。客户端同时存在的Highlight实例上限为 255 个(已禁用的实例也计入上限)。 - PointLight / SpotLight / SurfaceLight + Atmosphere + PostProcessing,用于营造整体氛围,让粒子呈现得恰到好处。
清理临时发射器
- 务必在克隆的一次性发射器达到其最长生命周期后销毁它们(使用
Debris:AddItem或task.delay)。不要让已禁用的发射器实例在工作区中不断累积。 - 对于附着的连续发射器,在重新设置父级或销毁之前,将
Enabled = false并调用:Clear(),以避免遗留粒子。 - 池化发射器时,在重复使用前将 Rate、Lifetime、Size 和 Transparency 重置为已知默认值,避免旧状态泄漏到下一次爆发中。
脚本
scripts/EffectBurst.lua:用于一次性粒子爆发的克隆并销毁辅助程序。克隆模板 Attachment/BasePart 下的所有 ParticleEmitter,在本地发射一轮粒子,并在最长生命周期结束后安排清理。由于不会修改原始发射器,因此可安全用于连续发射器。
参考索引
- particle-emitter-properties.md:调整粒子的外观、运动、发射方式或渲染开销。
- shapes-flipbooks-and-advanced.md:配置发射器形状、动画纹理、爆发效果或距离剔除。