SuperAPI AI 工具集

particle-system

设计与创作

查看项目

更新于 10-15 17:15

技能介绍

用途

ParticleSystem 用于在 Decentraland SDK7 场景中从某个实体发射粒子,实现火焰、烟雾、雪花、烟花、魔法光效、拖尾等视觉效果。每个实体只能有一个 ParticleSystem 组件,需与 Transform 一同挂载;粒子由组件自身渲染,不需要 Mesh。

主要能力

  • 连续发射:通过 rate 控制每秒发射粒子数。
  • 爆发发射:通过 bursts 在指定时间点离散发射,可设置次数、间隔与概率。
  • 发射器形状:Point(原点)、Sphere(球内随机)、Cone(锥形,angle 为半角)、Box(盒内随机)。
  • 粒子外观:initialSize/sizeOverTime 控制大小,initialColor/colorOverTime 控制颜色与透明度,initialRotation/rotationOverTime 控制旋转,texture 指定精灵贴图,spriteSheet 支持图集帧动画。
  • 运动控制:initialVelocitySpeed、gravity、additionalForce、limitVelocity、faceTravelDirection(沿速度方向,覆盖 billboard)。
  • 模拟空间:PSS_LOCAL(随实体移动)或 PSS_WORLD(留在世界空间形成拖尾)。
  • 播放控制:playbackState 可设为 PS_PLAYING、PS_PAUSED、PS_STOPPED;active 可关闭新粒子发射。
  • 混合模式:PSB_ALPHA、PSB_ADD、PSB_MULTIPLY。

使用方式

导入:

import { engine, Transform, ParticleSystem } from '@dcl/sdk/ecs'
import {
	PBParticleSystem_BlendMode,
	PBParticleSystem_PlaybackState,
	PBParticleSystem_SimulationSpace,
} from '@dcl/sdk/ecs'
import { Color4, Vector3, Quaternion } from '@dcl/sdk/math'

创建示例:

const emitter = engine.addEntity()
Transform.create(emitter, { position: Vector3.create(8, 1, 8) })
ParticleSystem.create(emitter, {
	rate: 20,
	lifetime: 2,
	maxParticles: 100,
	initialSize: { start: 0.1, end: 0.3 },
	sizeOverTime: { start: 1.0, end: 0.0 },
	initialVelocitySpeed: { start: 1, end: 2 },
	colorOverTime: {
		start: Color4.create(1, 1, 1, 1),
		end: Color4.create(1, 1, 1, 0),
	},
	shape: ParticleSystem.Shape.Point(),
})

发射器形状使用 ParticleSystem.Shape.* 辅助方法构建:

shape: ParticleSystem.Shape.Point()
shape: ParticleSystem.Shape.Sphere({ radius: 1 })
shape: ParticleSystem.Shape.Cone({ angle: 25, radius: 1 })
shape: ParticleSystem.Shape.Box({ size: Vector3.create(1, 1, 1) })

爆发示例:

bursts: {
	values: [{ time: 0, count: 100, cycles: 1, interval: 0.01, probability: 1.0 }]
}

播放控制:

const ps = ParticleSystem.getMutable(entity)
ps.playbackState = PBParticleSystem_PlaybackState.PS_PAUSED
ps.playbackState = PBParticleSystem_PlaybackState.PS_PLAYING
ps.playbackState = PBParticleSystem_PlaybackState.PS_STOPPED
ps.active = false

精灵图集动画:

texture: { src: 'assets/Images/flame-sheet.png' },
spriteSheet: { tilesX: 4, tilesY: 3, framesPerSecond: 12 }

Creator Hub 编辑器集成:在检查器中为实体添加 ParticleSystem 组件后,可直接在面板中实时调节所有字段,无需代码或重载场景。代码仅用于动态运行时行为(如由游戏逻辑切换发射器、将播放/停止绑定到触发器)。

组件名称为 core::ParticleSystem(组件 id 1217)。shape 为 protobuf oneof,序列化形如 {"$case":"sphere","sphere":{"radius":1}};texture 为扁平 Texture(非 TextureUnion),序列化形如 {"src":"assets/Images/spark.png"}。

适用场景

  • 环境氛围:雪花、雨、篝火、烟雾。
  • 特效:爆炸、拾取、魔法光环、闪电火花。
  • 拖尾:移动实体留下的轨迹(配合 PSS_WORLD 或 faceTravelDirection)。
  • 群集:蝙蝠群、蜜蜂群、落叶。
  • 烟花:循环或单次爆发。

限制与注意事项

  • Transform.scale 不会缩放粒子;粒子大小仅由 initialSize 与 sizeOverTime 控制。
  • 粒子仅对处于场景地块内的玩家渲染,地块外观看者看不到;粒子不属于场景 LOD 轮廓。
  • 引擎对每场景总粒子数有约 1000 的上限,超出时会自动降低所有活跃系统的发射率;建议用 maxParticles 限制每个系统。
  • 移动端限制(官方公布):发射器软限 8、硬限 10;活跃粒子软限 25,000、硬限 50,000;运行时单发射器钳制 5,000、单场景 50,000,超出部分会被静默削减。建议目标为 ≤8 个发射器、每个 maxParticles 远低于 5,000。
  • prewarm 仅在 loop: true 时生效。
  • faceTravelDirection 为 true 时覆盖 billboard。
  • additionalForce 始终为世界空间,即使 simulationSpace 为 PSS_LOCAL。
  • limitVelocity.dampen = 1 为硬钳制。
  • 建议在 colorOverTime 末尾将 alpha 设为 0 实现淡出。
  • bursts 在评估瞬间忽略 active = false。
  • 发射器实体无需 MeshRenderer。
  • 每个系统仅支持一个 texture。
  • 纹理路径默认 assets/Images/,旧场景可能位于 assets/scene/Images/ 或 assets/scene/textures/,Creator Hub 资源包位于 assets/asset-packs/,自定义资源位于 assets/custom/。
  • 头像/视频纹理用于粒子暂未验证。

资源

  • 预设参考:{baseDir}/references/particle-presets.md,包含 17 个预设(火焰余烬、魔法光环、降雪、漩涡、重力喷泉、蝙蝠群、翻滚落叶、闪电火花、大雨、单次爆发、小行星拖尾、紫色漩涡、蜜蜂群、循环烟花、篝火、火焰精灵、移动拖尾)。
  • 实时调参工具:ParticleLab.dcl.eth(使用 Decentraland 客户端打开)。
  • 示例场景:https://github.com/decentraland/sdk7-test-scenes/tree/main/scenes/0,7-particle-system