发射器是每个粒子效果背后那个看不见的生成器。它的组件决定它何时运行、产生多少粒子以及粒子从哪里出发。它们都写在粒子文件的 components 块中,与粒子组件放在一起。
刚接触粒子?请从你的第一个粒子开始,它会一步步带你做出一个完整的红宝石闪光效果。
每个发射器都需要什么
发射器需要一个生命周期组件和一个速率组件,否则它什么都不会生成。形状是可选的:没有形状时,粒子从发射器的中心出发。每一类组件只能使用一个。
本页大多数数值字段既可以填普通数字,也可以填 Molang 字符串,比如 "math.random(1, 3)"。表格中会标明字段何时被计算:发射器启动时计算一次、每次循环计算,或者每生成一个粒子时逐粒子计算。
设置
这些组件在任何东西生成之前运行。它们可以与其他任何组件一起使用。
| 组件 | 作用 | 关键字段 |
|---|---|---|
minecraft:emitter_initialization | 在发射器上运行 Molang,主要用来设置你自己的变量,供其他字段稍后读取 | creation_expression:发射器启动时运行一次。per_update_expression:每次更新时运行 |
minecraft:emitter_local_space | 用于附加在生物身上的效果:选择粒子是跟着生物移动,还是留在它们诞生的地方 | position、rotation、velocity(都是 true 或 false,默认 false) |
设置变量
emitter_initialization 是掷一次随机数并让每个粒子共享它的地方:
"minecraft:emitter_initialization": {
"creation_expression": "variable.ruby_hue = math.random(0.2, 0.4);"
}现在,这个发射器产生的每个粒子都可以读取 variable.ruby_hue,比如在它的着色中使用。
局部空间
默认情况下,粒子从发射器出发,之后就在世界中独立存在。如果生物走开了,它之前的粒子会留在原地,像一条尾迹。
position: true让粒子跟着生物移动。适合需要一直环绕在生物周围的光晕。rotation: true还会让它们跟着生物一起转动。它只能与position: true一起使用。velocity: true把生物的速度加到每个新粒子上,这样奔跑的生物甩出的火花会向前飞。
"minecraft:emitter_local_space": {
"position": true,
"rotation": true
}仅用于附加的效果
对于通过 /particle 或脚本在世界中某个位置播放的效果,局部空间不起任何作用。只有当生物或附着物播放这个效果时,它才有意义。
速率
速率决定粒子出现多少以及出现多快。选一个即可。
| 组件 | 作用 | 关键字段 |
|---|---|---|
minecraft:emitter_rate_instant | 在同一时刻生成一批粒子,就像一次爆发 | num_particles(默认 10,每次循环) |
minecraft:emitter_rate_steady | 以均匀的节奏一个接一个地生成粒子 | spawn_rate:每秒粒子数(默认 1)。max_particles:同时存在的最大数量(默认 50) |
minecraft:emitter_rate_manual | 自己什么都不生成。由游戏在需要时逐个生成粒子 | max_particles(默认 50) |
瞬时:一次爆发
"minecraft:emitter_rate_instant": {
"num_particles": 12
}如果发射器是循环的,每次循环开始时它都会再爆发一次。
稳定:一股粒子流
"minecraft:emitter_rate_steady": {
"spawn_rate": 20,
"max_particles": 40
}这会每秒产生 20 个粒子,但当已有 40 个存活时就停止添加新粒子。max_particles 是一道安全上限:请把它设得低一些,因为成百上千的粒子会让性能较弱的手机变卡。
手动:用于事件
emitter_rate_manual 用于游戏一次生成一个粒子的内置效果,比如雨滴溅起的水花。在你自己的效果中,它主要用于由其他效果通过 particle 类型事件生成的小效果(参见事件)。你自己播放的效果,请使用瞬时或稳定速率。
生命周期
生命周期决定发射器持续工作多久。选一个,如有需要再加上生命周期事件。
| 组件 | 作用 | 关键字段 |
|---|---|---|
minecraft:emitter_lifetime_once | 运行一次,然后移除自己 | active_time:生成持续的秒数(默认 10) |
minecraft:emitter_lifetime_looping | 运行、暂停、再运行,直到被某个东西移除 | active_time:运行的秒数(默认 10)。sleep_time:循环之间暂停的秒数(默认 0) |
minecraft:emitter_lifetime_expression | 由 Molang 控制开关,每帧检查一次 | activation_expression:不为 0 时生成(默认 1)。expiration_expression:一旦不为 0 就移除发射器(默认 0) |
minecraft:emitter_lifetime_events | 在发射器生命中的某些时刻触发你的事件 | creation_event、expiration_event、timeline、travel_distance_events、looping_travel_distance_events |
一次
用命令或脚本播放一次性效果时的最佳选择:
"minecraft:emitter_lifetime_once": {
"active_time": 1
}配合 emitter_rate_instant 时,爆发发生在开头,所以 active_time 可以很短。
循环
"minecraft:emitter_lifetime_looping": {
"active_time": 2,
"sleep_time": 3
}这会闪烁 2 秒,休息 3 秒,然后重复。循环适用于附加在生物身上或由动画控制器播放的效果,当生物或状态消失时,游戏会替你移除发射器。
表达式
非常适合跟随生物、能自己开关的效果:
"minecraft:emitter_lifetime_expression": {
"activation_expression": "query.ground_speed > 0.1",
"expiration_expression": 0
}这只会在生物行走时闪烁,并且永远不会移除自己。像 query.ground_speed 这样的查询读取的是效果所附加的那个生物。
事件
emitter_lifetime_events 指向同一文件中 events 块里的名字。每个字段可以填一个事件名,也可以填一个名字列表。
"minecraft:emitter_lifetime_events": {
"creation_event": "flash",
"expiration_event": "pop",
"timeline": {
"0.5": "twinkle",
"1.0": ["twinkle", "chime"]
},
"travel_distance_events": {
"4.0": "dust"
},
"looping_travel_distance_events": [
{ "distance": 1.0, "effects": ["dust"] }
]
}| 字段 | 触发时机 |
|---|---|
creation_event | 发射器启动时 |
expiration_event | 发射器结束时。它不会等待粒子消失 |
timeline | 在这些时间点(单位为秒)。每次循环都会再次运行 |
travel_distance_events | 发射器总共移动了这么多格时,触发一次 |
looping_travel_distance_events | 每移动这么多格就触发一次,反复进行。非常适合做脚印或弹射物后面的尾迹 |
形状
形状决定每个粒子从哪里出发,以及它朝向哪个方向。particle_initial_speed 就是沿着这个方向推动粒子的。选一个即可。
| 组件 | 粒子的出发位置 | 关键字段 |
|---|---|---|
minecraft:emitter_shape_point | 全部从同一个点出发 | offset、direction |
minecraft:emitter_shape_sphere | 在球体内部或其表面上 | radius(默认 1)、offset、surface_only、direction |
minecraft:emitter_shape_box | 在盒子内部或其表面上 | half_dimensions、offset、surface_only、direction |
minecraft:emitter_shape_disc | 在一个平面圆上或其边缘 | radius(默认 1)、plane_normal、offset、surface_only、direction |
minecraft:emitter_shape_custom | 由你的 Molang 决定 | offset、direction |
minecraft:emitter_shape_entity_aabb | 在所附加生物周围的盒子内部 | surface_only、direction |
各形状共用的字段
| 字段 | 作用 |
|---|---|
offset | 把出发位置从发射器移开,格式为 [x, y, z],单位是方块。逐粒子计算,所以在这里用 Molang 可以把它们打散 |
direction | 新粒子朝向哪里。"outwards"(背离中心,默认值)、"inwards"(朝向中心),或者你自己的 [x, y, z] |
surface_only | true 只在形状的外表面生成,而不在内部生成。默认为 false |
点形状和自定义形状只接受 [x, y, z] 方向,因为它们没有可以背离的中心。
点
"minecraft:emitter_shape_point": {
"offset": [0, 0.5, 0],
"direction": [0, 1, 0]
}每个粒子都从发射器上方半格处出发,并笔直朝上。
球体
"minecraft:emitter_shape_sphere": {
"radius": 0.5,
"surface_only": true,
"direction": "outwards"
}一个四散飞开的空心闪光球。试试把方向改成 "inwards" 并配合较短的生命周期,就能做出“聚集力量”的效果。
盒子
"minecraft:emitter_shape_box": {
"offset": [0, 0.5, 0],
"half_dimensions": [0.5, 0.5, 0.5],
"direction": [0, 1, 0]
}half_dimensions 是从中心开始量的,所以每边都是 0.5 时正好填满一个方块。适合覆盖整个方块的效果,比如发光的矿石。
圆盘
"minecraft:emitter_shape_disc": {
"radius": 1.5,
"plane_normal": "y",
"surface_only": true,
"direction": "outwards"
}plane_normal 是圆盘朝向的轴。"y"(默认值)让它像地毯一样平铺,"x" 和 "z" 让它像墙一样立起来。你也可以填自己的 [x, y, z]。这个例子会在地面上形成一个向外扩散的圆环:一个很棒的落地效果。
自定义
"minecraft:emitter_shape_custom": {
"offset": [
"math.random(-0.1, 0.1)",
"math.random(0, 2)",
"math.random(-0.1, 0.1)"
],
"direction": [0, 1, 0]
}使用自定义形状时,出发位置由你自己以 [x, y, z] 计算。这里把每个粒子放在最高 2 格的随机高度上,但在水平方向上保持靠近中间:一根细细的闪光柱,就像一道光束。每个值都会为每个粒子重新计算。
实体盒
"minecraft:emitter_shape_entity_aabb": {
"surface_only": false,
"direction": [0, 0.2, 0]
}它使用生物自己的碰撞箱,所以同一个效果无需修改就能同时适配鸡和红宝石傀儡。如果效果没有附加在生物身上,粒子就会从发射器所在的点出来。
完整的发射器
把每一类各取一个组合起来。这个光环会在生物存在时循环,并紧贴着它:
"minecraft:emitter_local_space": {
"position": true,
"rotation": false
},
"minecraft:emitter_lifetime_looping": {
"active_time": 1
},
"minecraft:emitter_rate_steady": {
"spawn_rate": 8,
"max_particles": 20
},
"minecraft:emitter_shape_entity_aabb": {
"surface_only": true,
"direction": [0, 1, 0]
}