mcpField
R
roblox-vfx

roblox-vfx

github.com/nonlooped创意与媒体24736 次安装1 周前更新
代码仓库

关于 roblox-vfx

roblox-vfx 是面向 Roblox 开发者的粒子效果制作与优化技能,提供 ParticleEmitter 属性、形状、动画纹理和渲染控制的指导。内容也涵盖客户端特效、距离剔除、性能分析及瞬时发射器清理。

主要功能

  1. 01调节粒子外观与运动
  2. 02配置发射形状和翻页动画
  3. 03控制光照与渲染效果
  4. 04分析过度绘制并优化性能
  5. 05管理客户端发射与效果清理

适用场景

  1. 01制作环境粒子和一次性爆发效果
  2. 02为移动设备优化粒子渲染
  3. 03将特效连接到角色部件或动画事件
  4. 04按距离控制环境特效并回收发射器

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/nonlooped/roblox-suite --skill roblox-vfx

安装后在 Claude Code 中输入/roblox-vfx确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
particle-emitter-properties.md
shapes-flipbooks-and-advanced.md
scripts/
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 才会生效。

调整粒子外观

  1. 纹理(优先使用带 alpha 通道的 .png;使用灰度图并将 LightEmission 设为 1,以隐藏暗部)。
  2. 颜色(ColorSequence;即使在 Studio 中只设置一个 Color3,也会存储为只有一个关键点的 ColorSequence;可用于设置粒子生命周期内的渐变)。
  3. 大小(NumberSequence,通常使用 envelope 实现自然变化)。警告: 尺寸越大,GPU 填充率开销越高。
  4. 透明度(NumberSequence)。让粒子淡入或淡出,避免突然出现或消失。
  5. 生命周期(或使用 NumberRange 为每个粒子设置随机值)。
  6. 发射速率(每秒发射的粒子数;每个发射器的硬性上限约为桌面端 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,在本地发射一轮粒子,并在最长生命周期结束后安排清理。由于不会修改原始发射器,因此可安全用于连续发射器。

参考索引

评论

支持 Markdown