ParticleEmitter 是一个特殊对象,可以将可定制的2D粒子发射到世界中。要发射和渲染粒子,它必须作为父对象放置在BasePart或Attachment内。当它作为父对象放置在BasePart上时,粒子会在该部件的边界框或形状内随机生成;当它放置在Attachment上时,粒子则从附件的位置发射。
当发射器的Enabled为true且Rate大于0时,粒子会自动发射;或者当调用Emit方法时手动发射。如果有非零的Speed,粒子将根据ShapeInOut属性向外和/或向内运动。
默认情况下,粒子面向摄像机,但可以修改Orientation以遵循粒子速度。
在粒子的Lifetime期间,它们可以根据Color和Size改变外观。它们的运动可能会随时间变化,取决于Drag和Acceleration属性,并且当它们被LockedToPart锁定到部件或具有非零的VelocityInheritance时,也可以随父对象移动。
要了解有关创建和定制粒子发射器的更多信息,请参见粒子发射器。
代码示例
这个相当冗长的代码示例展示了如何设置 ParticleEmitter 的每个属性,包括 NumberRange、NumberSequence 和 ColorSequence 属性。下面是每个属性设置后粒子发射器的外观。尝试调整不同的属性来定制效果的外观!
local emitter = Instance.new("ParticleEmitter")
-- 粒子数量 = 速率 * 生命周期
emitter.Rate = 5 -- 每秒粒子数
emitter.Lifetime = NumberRange.new(1, 1) -- 粒子应存活的时间(最小,最大)
emitter.Enabled = true
-- 可视属性
emitter.Texture = "rbxassetid://1266170131" -- 一张透明的白色圆环图片
-- 对于颜色,使用 ColorSequenceKeypoint 构建一个 ColorSequence
local colorKeypoints = {
-- API: ColorSequenceKeypoint.new(time, color)
ColorSequenceKeypoint.new(0, Color3.new(1, 1, 1)), -- 在 t=0,白色
ColorSequenceKeypoint.new(0.5, Color3.new(1, 0.5, 0)), -- 在 t=.5,橙色
ColorSequenceKeypoint.new(1, Color3.new(1, 0, 0)), -- 在 t=1,红色
}
emitter.Color = ColorSequence.new(colorKeypoints)
local numberKeypoints = {
-- API: NumberSequenceKeypoint.new(time, size, envelop)
NumberSequenceKeypoint.new(0, 1), -- 在 t=0,完全透明
NumberSequenceKeypoint.new(0.1, 0), -- 在 t=.1,完全不透明
NumberSequenceKeypoint.new(0.5, 0.25), -- 在 t=.5,主要不透明
NumberSequenceKeypoint.new(1, 1), -- 在 t=1,完全透明
}
emitter.Transparency = NumberSequence.new(numberKeypoints)
emitter.LightEmission = 1 -- 当粒子重叠时,乘以它们的颜色使其更亮
emitter.LightInfluence = 0 -- 不受世界光照影响
-- 速度属性
emitter.EmissionDirection = Enum.NormalId.Front -- 向前发射
emitter.Speed = NumberRange.new(0, 0) -- 速度为零
emitter.Drag = 0 -- 不对粒子运动施加阻力
emitter.VelocitySpread = NumberRange.new(0, 0)
emitter.VelocityInheritance = 0 -- 不继承父级速度
emitter.Acceleration = Vector3.new(0, 0, 0)
emitter.LockedToPart = false -- 不将粒子锁定到父级
emitter.SpreadAngle = Vector2.new(0, 0) -- 在任一轴上没有扩散角度
-- 模拟属性
local numberKeypoints2 = {
NumberSequenceKeypoint.new(0, 0), -- 在 t=0,大小为0
NumberSequenceKeypoint.new(1, 10), -- 在 t=1,大小为10
}
emitter.Size = NumberSequence.new(numberKeypoints2)
emitter.ZOffset = -1 -- 渲染略微在实际位置后面
emitter.Rotation = NumberRange.new(0, 360) -- 从随机旋转开始
emitter.RotSpeed = NumberRange.new(0) -- 在模拟期间不旋转
-- 创建一个附件,以便粒子从确切相同的位置发射(同心环)
local attachment = Instance.new("Attachment")
attachment.Position = Vector3.new(0, 5, 0) -- 将附件稍微向上移动
attachment.Parent = script.Parent
emitter.Parent = attachment
概要
属性
确定所有活动粒子的全局轴加速度,单位为每秒平方 Stud。
当ParticleEmitter.LightInfluence为0时,缩放发射器发出的光的强度。
确定所有活动粒子在其各自生命周期中的颜色。
确定粒子通过指数衰减失去一半速度的速率。
确定粒子从哪个面发射。
确定粒子是否从发射器中发射。
确定翻页纹理以每秒帧数的速度动画。
如果Texture与翻页不兼容,显示的错误信息。
确定翻页纹理的布局。必须是None,Grid2x2,Grid4x4或Grid8x8。
确定翻页动画的类型。必须是Loop,OneShot,PingPong或Random。
确定动画是否从每个粒子选择的随机帧开始,而不是总是从帧零开始。
定义新发射粒子的年龄的随机范围。
确定粒子的颜色与它们后面的颜色的混合程度。
确定粒子受到环境光的影响程度。
确定粒子与它们所发射的部件的移动关系。
指定粒子的朝向。
确定每秒发射的粒子数量。
确定发射粒子的角速度范围,以度为单位。
确定新发射粒子的旋转范围,以度为单位。
设置发射器的形状为盒子,球体,圆柱体或圆盘。
设置粒子是向外发射,仅向内发射,还是双向发射。
影响来自圆柱,圆盘,球体和盒子形状的粒子发射。
将粒子发射设置为体积发射或仅表面发射。
确定粒子在其各自生命周期中的世界大小。
确定新粒子发射时的随机速度范围(最小到最大),以每秒Stud为单位。
确定粒子可以随机发射的角度,以度为单位。
允许粒子在其生命周期内非均匀缩放,由曲线控制。
确定显示在粒子上的图像。
介于0和1之间的值,用于控制粒子效果的速度。
确定粒子在其各自生命周期中的透明度。
确定粒子发射时继承父对象的速度程度。
确定发射的粒子是否遵循Workspace.GlobalWind向量。
确定粒子的前后渲染位置;用于控制渲染在顶部/底部的粒子。
属性
Acceleration
Acceleration属性确定粒子的Speed在其生命周期内如何变化。它通过使用Vector3来定义全局X/Y/Z轴的加速度,并且以每秒平方Stud为单位。当更改此属性时,它会影响发射器发射的所有粒子,包括当前的和未来的粒子。
如果向量指向粒子发射方向的相反方向,阻力将减慢粒子的运动。否则,它将加速它们。
Color
Color属性确定所有活动粒子在其各自生命周期中的颜色。该颜色应用于渲染时的Texture,并且它使用纹理Alpha及发射器的Transparency。如果发射器的LightEmission值大于0,较暗的颜色使粒子看起来更加透明。
更改此属性会影响发射器发射的所有粒子,包括当前的和未来的。
当此属性使用渐变ColorSequence时,粒子的现在颜色由使用粒子的年龄和其总生命周期对序列进行线性插值来确定。例如,如果一个粒子在2秒前生成,并且具有4秒的生命周期,颜色将是ColorSequence中50%位置的颜色。
EmissionDirection
EmissionDirection属性确定粒子从父对象的哪个面(Enum.NormalId)发射。负的Speed意味着粒子在相反方向发射。SpreadAngle进一步变化发射方向。
如果您将ParticleEmitter添加到具有方向的Attachment,您可以旋转附件本身(Attachment.Orientation),而不是使用此属性。
Enabled
Enabled属性确定粒子是否从发射器中发射。将其设置为false将停止进一步粒子的生成,但任何现有粒子仍然会保持活动状态,直到它们过期。此属性在您有一个预先制作的粒子效果并希望在需要它发射粒子之前保持禁用时非常有用。
FlipbookFramerate
FlipbookFramerate属性确定翻页纹理动画的速度,以每秒帧数为单位。与Lifetime类似,您可以设置一个最小和最大范围来随机化翻页的帧速率,最大值为每秒30帧。
FlipbookIncompatible
如果Texture与翻页不兼容,显示的错误信息。翻页纹理的像素尺寸必须为8×8、16×16、32×32、64×64、128×128、256×256、512×512或1024×1024。
FlipbookLayout
FlipbookLayout属性确定纹理的布局。它可以是Enum.ParticleFlipbookLayout枚举的任何值:
- None – 禁用翻页特性,并在粒子的生命周期内将纹理用作单个静态纹理。
- Grid2x2 – 2×2帧用于4帧动画。
- Grid4x4 – 4×4帧用于16帧动画。
- Grid8x8 – 8×8帧用于64帧动画。
FlipbookMode
FlipbookMode属性确定翻页动画的类型。它可以是Enum.ParticleFlipbookMode枚举的任何值:
- Loop – 持续播放所有帧,在播放完最后一帧后重新从第一帧开始。
- OneShot – 仅在粒子的生命周期内播放动画一次。在此设置下,FlipbookFramerate属性不起作用;相反,帧速率由粒子的Lifetime除以动画中的帧数平均确定。OneShot动画对于清晰的非重复动画很有用,例如创建烟雾云并随后淡出。
- PingPong – 从第一帧播放到最后一帧,然后从最后一帧逆向播放到第一帧,在粒子的Lifetime内重复。
- Random – 按随机顺序播放帧,在一个帧到下一个帧之间进行混合/交叉淡化。这在低帧速率下,对于有机粒子纹理(例如星星缓慢闪烁时在微妙形状之间变化)非常有用。
FlipbookStartRandom
FlipbookStartRandom属性确定每个粒子是否在动画的随机帧开始,而不是总是从第一帧开始。一个用例是启用此属性同时将FlipbookFramerate设置为零,导致每个发射的粒子都是从翻页纹理中随机选择的静态帧。
Lifetime
Lifetime属性定义新发射粒子的最大和最小年龄。生命周期是按粒子存储的,因此如果更改此值,现有的粒子将保持活动状态,直到它们随机选择的生命周期结束。生命周期为0将阻止粒子完全发射。
LightEmission
LightEmission属性确定Texture的颜色与其后面的颜色的混合程度。值为0时,使用正常混合模式,而值为1时,使用加法混合。此属性的变化会立即影响发射器所拥有的所有粒子,包括当前的和未来的粒子。
此属性不应与LightInfluence混淆,因此它确定粒子如何受到环境光的影响。
此属性不会使粒子照亮周围环境。要实现此效果,请考虑使用PointLight。
LightInfluence
LightInfluence属性确定环境光在渲染时对单个粒子颜色的影响程度。值必须在0–1的范围内;超出此范围的值未定义。在0时,粒子完全不受光影响(保持完整亮度);在1时,粒子完全受光影响(在完全黑暗中,粒子将为黑色)。
默认情况下,如果使用Studio工具插入,则该值为1。如果使用Instance.new()插入,则为0。
LocalTransparencyModifier
LockedToPart
LockedToPart属性确定粒子是否“粘附”到发射源(Attachment或BasePart,其中ParticleEmitter被作为父对象放置)。如果为true,活动粒子将与父对象一起移动。
另外,考虑将VelocityInheritance属性的值设置为1,这可能更适合某些效果。
Orientation
Orientation属性确定应使用的发射器粒子几何的方向模式。
Orientation | 粒子行为 |
---|---|
FacingCamera | 标准的面向摄像机的账板四边形;默认行为。 |
FacingCameraWorldUp | 面向摄像机,但仅在垂直向上的世界Y轴上旋转。 |
VelocityParallel | 与其运动方向平行对齐。 |
VelocityPerpendicular | 与其运动方向垂直对齐。 |
RotSpeed
RotSpeed属性确定新发射粒子的随机角速度范围,以度每秒为单位。每次发射时随机选择一个角速度,因此更改此属性不会影响活动粒子。此属性与Rotation一起影响渲染粒子图像的角度。
角速度非常高的粒子可能看起来旋转得更慢甚至不旋转,因为旋转角度与软件渲染速度同步。例如,当粒子的旋转正好在每帧360度时,将不会有明显的旋转变化。
Rotation
Rotation属性确定新发射粒子的旋转范围,以度为单位。正值表示顺时针方向。该属性通常设置为[0, 360]以为新粒子提供完全随机的旋转。RotSpeed也会影响粒子在其生命周期中的旋转。
更改此值只会影响新粒子;现有粒子保持其最初发射时的旋转。
Shape属性将发射器的形状设置为盒子、球体、圆柱体或圆盘。进行选择后,您可以调整ShapeStyle、ShapeInOut和ShapePartial属性以进一步定制粒子发射。有关视觉示例,请参见这里。
ShapePartial
根据Shape值,此属性会执行不同的操作:
对于圆柱,指定顶部半径比例。值为0表示圆柱顶部半径为零,形成锥形。值为1表示圆柱没有变形。
对于圆盘,指定内半径比例。值为0表示圆盘完全封闭(圆/椭圆),而值为1表示仅在圆盘的最外缘发射。介于0和1之间的值从一定厚度的环形发射。
对于球体,指定粒子发射的半球角度。值为1表示粒子从整个球体发射;值为0.5表示粒子从半球发射;值为0表示粒子仅从北极的一个点发射。
有关视觉示例,请参见这里。
Size
Size属性确定所有活动粒子在其各自生命周期中的世界大小。此属性代表每个粒子的Texture的维度。它是一个NumberSequence,在影响粒子随时间变化的方式上类似于Transparency。
粒子的现在大小通过使用粒子的年龄和其总生命周期在线性插值此序列来确定。例如,如果一个粒子在2秒前生成并且具有4秒的生命周期,大小将是NumberSequence中50%位置的大小。对于具有非零信封值的任何NumberSequenceKeypoint,在粒子发射时为每个关键点选择钥匙点范围内的随机值。
Speed
Speed属性确定新粒子发射时的随机速度范围(最小到最大),以每秒Stud为单位。每个粒子的速度在发射时随机选择,并应用到EmissionDirection。负值导致粒子反向移动。
请注意,更改Speed不会影响活动粒子,它们保持先前的速度。然而,Acceleration、Drag和VelocityInheritance可以用来影响活动粒子在其生命周期内的速度。
SpreadAngle
SpreadAngle属性确定粒子可能发射的随机角度。例如,如果EmissionDirection为Top(+Y),该Vector2描述了在X/Z轴上角度散布的大小,以度为单位。
将一个轴设置为360将使粒子在圆形中发射。将两个轴都设置为360将使粒子在球形中发射。
Texture
Texture属性确定显示在粒子上的图像。该图像受到Color、Transparency、LightInfluence和LightEmission的影响。具有透明背景的纹理最适合用于粒子。
Transparency
Transparency属性确定所有活动粒子在其各自生命周期中的透明度。它与Size在影响粒子随时间变化的方式上类似。在渲染方面,值为0表示完全可见(不透明),值为1表示完全不可见(根本不渲染)。
粒子的当前透明度通过使用粒子的年龄和其总生命周期对该序列进行线性插值来确定。例如,如果一个粒子在2秒前生成并且具有4秒的生命周期,透明度将是NumberSequence中50%位置的透明度。对于具有非零信封值的任何NumberSequenceKeypoint,每个粒子发射时为每个关键点选择钥匙点范围内的随机值。
VelocityInheritance
VelocityInheritance属性确定粒子在发射时继承父对象Velocity的程度。值为0表示完全不继承任何速度,而值为1表示粒子的速度与父BasePart完全相同。
与Drag结合使用时,粒子发射器可以看起来像是从活动部件“脱离”粒子。
ZOffset
ZOffset属性确定粒子前后渲染的位置,单位为Stud,而不改变它们在屏幕上的大小。当此属性更改时,它影响所有当前和未来的粒子。请注意,此属性接受小数值;它与GuiObject.ZIndex(整数)不同。
正值使粒子更靠近摄像机,而负值则使粒子远离摄像机。足够负的值可能会导致粒子在部件内或后面渲染。
方法
Clear
Clear方法立即清除通过ParticleEmitter自然发射(Enabled发射器上为非零Rate)或通过Emit()发射的所有现有粒子。
返回
代码示例
此代码示例使 ParticleEmitter 每 2 秒以 10 个粒子为一次爆发进行 ParticleEmitter:Emit() 发射。在此之前,它会 ParticleEmitter:Clear() 清除任何现有粒子。
local emitter = script.Parent
while true do
emitter:Clear()
emitter:Emit(10)
task.wait(2)
end
Emit
Emit方法将导致ParticleEmitter立即发射指定数量的粒子。
参数
要发射的粒子数量。
返回
代码示例
此代码示例使父级 ParticleEmitter 根据父级 BasePart 移动的距离来 ParticleEmitter:Emit() 粒子。
local RunService = game:GetService("RunService")
local emitter = script.Parent
local part = emitter.Parent
local PARTICLES_PER_STUD = 3
local lastPosition = part.Position
local distance = 0
local function onStep()
local displacement = part.Position - lastPosition
distance = distance + displacement.magnitude
local n = math.floor(distance * PARTICLES_PER_STUD)
emitter:Emit(n)
distance = distance - n / PARTICLES_PER_STUD
lastPosition = part.Position
end
RunService.Stepped:Connect(onStep)
emitter.Enabled = false
此代码示例使 ParticleEmitter 每 2 秒以 10 个粒子为一次爆发进行 ParticleEmitter:Emit() 发射。在此之前,它会 ParticleEmitter:Clear() 清除任何现有粒子。
local emitter = script.Parent
while true do
emitter:Clear()
emitter:Emit(10)
task.wait(2)
end