Minecraft Wiki

除另有声明,转载时均必须注明出处若簡繁轉換出錯,請以遊戲內為準请勇于扩充与修正内容有兴趣逛逛我们的微博沟通交流,欢迎到社区专页需要协助,请在告示板留言

了解更多

Minecraft Wiki
Advertisement

Template:Bedrock Edition Developer Documentation

Information icon
此特性为基岩版独有。

Template:Translation:未知参数。

Ic translate
此条目的(部分)内容需要翻译。

你可以帮助我们来翻译此条目,但请勿使用机器翻译

翻译者从英文条目翻译下文中的内容时感觉其艰涩难懂。

翻译者希望更有能力的用户能够帮助改善本条目的行文,所以请先慎重对待本条目内容。
如果可能,请帮助我们完善此条目的内容。

Brush
该文章需要整理以符合格式指导 讨论

请帮助优化文章格式来让它符合格式指导。

这是适用于基岩版1.12.0颗粒文档

版本:1.12.0.28

颗粒示例文档

上方的链接中提供了若干种颗粒效果的示例。这些示例展示了多种独立运作的颗粒效果,它们与游戏本体一同安装,经过了调整来与游戏协同运作。因此,它们并不能作为合格的颗粒示例被给出。敬请参考包中的示例以获悉应用颗粒系统的多种方式。

想要在示例颗粒包启用的情况下调用示例颗粒,首先唤起控制台,键入"/particle name x y z"(这里的"name"为颗粒效果的名称,x/y/z为颗粒效果出现的位置)。

例如,输入"/particle minecraft:example_smoke_puff 0 5 0"指令会在世界出生点生成一团距世界底部5格高的烟雾;
而"/particle minecraft:example_smoke_puff ~ ~1 ~5"指令则会将烟雾生成在玩家的5格开外。

示例效果
Name Description
minecraft:example_beziercurve 在效果中展示Bezier曲线的运用
minecraft:example_bounce 展示颗粒的碰撞检测与弹跳效果
minecraft:example_catmullromcurve 在效果中展示catmull-rom曲线的运用
minecraft:example_colorcurve 在效果中展示色彩渐变的运用
minecraft:example_colorcurve2 在效果中展示协同可变间距的色彩渐变的运用
minecraft:example_combocurve 在效果中展示各类曲线的运用
minecraft:example_directional_sphere Demonstrates the use of directional billboard facing in an effect
minecraft:example_entity_sparkle_box When attached to an entity, this effect creates a sparkle effect in a box around the entity
minecraft:example_entity_sparkle_aabb When attached to an entity, this effect creates a sparkle effect with the rough axis-aligned bounding box around the entity
minecraft:example_expire_on_contact Demonstrates particles disappearing when colliding with the terrain
minecraft:example_flipbook Demonstrates texture uv flipbook technique, of applying successive frames of a texture for visual animation
minecraft:example_highrestitution Demonstrates particle collision with particles gaining energy on each bounce
minecraft:example_linearcurve Demonstrates a piecewise linear curve in an effect
minecraft:example_particle_event_system Demonstrates various particle events executing
minecraft:example_smoke_puff Demonstrates a general smoke puff effect
minecraft:example_spiral Demonstrates a parametric motion spiral effect
minecraft:example_watertest Demonstrates excluding particles from various block types, in this case, particles only survive in water
minecraft:fireworks_events_demo Demonstrates sequencing various particle effects together via events to create a fireworks effect

组件

颗粒系统是基于组件的,也就是说颗粒系统是由一系列组件组合而成的。要使颗粒效果运作,你需要加入处理某方面效果的组件。例如,颗粒发射容器需要定义其寿命规则,因此效果应该有一条或以上处理发射容器(emitter)和发射颗粒的寿命规则。

新组件可以在晚些时候加进来,开发者可把组件合并以获得不同的行为。例如,颗粒可以拥有四处移动的动态(Dynamic)组件以及处理与地形之间的互动的碰撞(Collision)组件。这些组件会告知颗粒系统开发者想让释放器或颗粒做的事情,而不是给出一个颗粒参数列表并不断调整这些参数而获得所需实现的行为。

命名空间

所有颗粒系统都必须在其名称中命名空间化。

在效果标签前应该加上“<string:命名空间名称>:”命名空间。

原版Minecraft使用“minecraft:”前缀。

查看§示例来获取示例名称。

与MoLang的交互

任何可用的字段都能使用MoLang表达式。MoLang表达式是一个字符串,并在MoLang文档中定义。颗粒系统使用一些特殊的MoLang变量以供颗粒MoLang表达式使用。另外,设置自定义MoLang参数的方法有很多,它也用在效果中的MoLang表达式里。

参数
名称 描述
variable.particle_lifetime 颗粒持续时间。
variable.particle_age 颗粒当前寿命。
variable.particle_random_1 一个从0.0到1.0的随机数,在颗粒的持续时间内保持不变。
variable.particle_random_2 另一个从0.0到1.0的随机数,在颗粒的持续时间内保持不变。
variable.particle_random_3 第三个从0.0到1.0的随机数,在颗粒的持续时间内保持不变。
variable.particle_random_4 第四个从0.0到1.0的随机数,在颗粒的持续时间内保持不变。
variable.emitter_lifetime 发射容器的当前循环持续多长时间。
variable.emitter_age 发射容器当前循环启动后的寿命。
variable.emitter_random_1 一个从0.0到1.0的随机数,在发射容器的当前循环内保持不变。
variable.emitter_random_2 另一个从0.0到1.0的随机数,在发射容器的当前循环内保持不变。
variable.emitter_random_3 第三个从0.0到1.0的随机数,在发射容器的当前循环内保持不变。
variable.emitter_random_4 第四个从0.0到1.0的随机数,在发射容器的当前循环内保持不变。
variable.entity_scale 当效果附加到一个实体时,此值是实体的大小比例

基础结构概览

颗粒效果由基本渲染参数和一系列组件组成。组件的放置顺序没有限制。

概要:
{
  "format_version": "1.10.0",
  "particle_effect": {
    "description": {
      "identifier": <string>, 
      // 如:“minecraft:test_effect”为要引用的颗粒
      "basic_render_parameters": {
          "material": <string> 
          // 发射容器要引用的材料
          "texture": <string> 
          // 发射容器要引用的材质
      }
    },
    "curves": {
      // 曲线的详细定义
    },
    "components": 
      // 发射频率组件

      // 发射寿命组件

      // 发射形状(或通过颗粒发射位置和方向定义其形状的)组件

      // 发射容器本地空间组件

      // 控制颗粒初始状态的组件

      // 控制/引导颗粒行为的组件

      // 影响颗粒渲染方式的组件

      // 影响颗粒寿命的组件
    }
  }
}

结构详细内容

概要:
{
  // specifies the format version of the particle.  Only particles of a particular set of versions 
  // will work with the game
  "format_version": "1.10.0",

  "particle_effect": {
    // general data for the particle effect
    "description": {
      // e.g. "minecraft:test_mule", this is the name the particle emitter is referred to as
      "identifier": <string>, 

      // Basic render parameters are basic rendering 
      // properties like the texture used, or the material used.
      // All particles require a material to render, and a 
      // texture to draw.  
      "basic_render_parameters": {
          "material": <string>
          "texture": <string>
      },
    },

    "curves": {
	  // curves are described elsewhere in the document
    },

    "events": {
      // events are described elsewhere in the document
    },

    "components: {
        /////////////////////////////////////////////////////////////////////
        // Emitter related components
        // these components primarily affect the emitter bevahior

        // emitter initial state components set up the emitter with
        // particular properties

        // emitter rate components control when particles get emitted
        // these will be run every frame for the emitter to determine if any 
        // particles need to be spawned

        // emitter lifetime components control the lifetime of the emitter
        // and the "enabled/disabled" state of the emitter.
        // Emitters can only spawn particles if enabled.

        // emitter shapecomponents control where a particle gets emitted
        // and initial shape-driven state such as particle direction

        // emitter local space components
        // this component specifies whether entity-based emitters 
        // simulate in local or global space

        /////////////////////////////////////////////////////////////////////
        // Particle related components
        // these components primarily affect the particle behavior

        // particle initial condition components control what the initial state
        // of the particles is, such as initial speed, rotation, etc.
        // These are run once at particle creation

        // particle motion components control what happens to the particle
        // on frames after creation, such as it's position (for
        // a parametric particle), drag/acceleration (for a dynamic
        // particle), etc.
        // These are run once per frame per particle

        // particle appearance components control how the particle is rendered 
        // such as what UV coortinates to use, size of the particle,
        // billboard orientation, color tinting, etc.
        // These are run once per frame for visible particles

        // these components handle when the particle expires
    }
  }
}

Curves

Curves are interpolation values, with inputs from 0 to 1, and outputs based on the curve. The result of the curve is a MoLang variable of the same name that can be referenced in MoLang in components. For each rendering frame for each particle, the curves are evaluated and the result is placed in a MoLang variable of the name of the curve.

    "curves": {
      // "molangvar" is the MoLang variable to be used later in MoLang expressions
      // for example "variable.mycurve" here would make the result of the curve
      // available in MoLang as "variable.mycurve".  Note that all variables must begin with "variable."
      "molangvar": {
        // type can be "linear", "bezier", or "catmull_rom"
        "type": type, 

        // control nodes for curve.  These are assumed to be equally
        // spaced, e.g. first node is at input value 0, second at 0.25, etc
        "nodes": [<float/molang>, <float/molang>, <float/molang>, <float/molang>],

        // what is the input value to use
        "input": <float/molang>,

        // what is the range the input is mapped onto
        // between 0 and this value
        "horizontal_range": <float/molang>
      }
    }


Events

Events are particle events that can be triggered elsewhere in the .json. An event triggers a particle effect. If the type is "emitter", this will create an emitter of "effect" type at the event's world position, in a fire-and-forget way. "emitter_bound" works similarly, except if the spawning emitter is bound to an actor/locator, the new emitter will be bound to the same actor/locator. If the type is "particle", then the event will manually emit a particle on an emitter of "effect" type at the event location, creating the emitter if it doesn't already exist (be sure to use "minecraft:emitter_rate_manual" for the spawned emitter effect). "particle_with_velocity" will do the same as "particle" except the new particle will inherit the spawning particle's velocity.

The events themselves consist of an optional node tree and/or an actual event. When "sequence" is specified, that array will execute in order, with every element executing when that event fires. When using "random", one element will be picked from the array based on the weight.

	// events block:
	"events": {
		"event_name1",
		"event_name2",
		...
	}

	// structure of an event, note that nesting can be any combination of "sequence", or "randomize"
      "event_name": {
        "sequence": [
          { /*this node executes first*/ },
          { /*this node executes second*/ },
          { /* etc */},
          { 
            "sequence": [
              { 
                // nested nodes
              },
              ...
            ]
          },
          { 
            "randomize": [
              {
                "weight": <float>
                /* data for this option, including other sequences/randoms */
              },
              ...
            ]
          }
        ]
      },

      // Fields for a particlar event.  Note that any of the above nodes can have events inserted into their blocks.
      "event_subpart": {
          "particle_effect": {
            // identifier of the effect
            "effect": <string>,
            // "emitter", "emitter_bound", "particle" or "particle_with_velocity"
            "type": <string>,
            // this MoLang is run on the emitter for this event once this
            // event fires
            // NOTE: this will not have access to the event
            // triggering emitter's MoLang data
            "pre_effect_expression": <string>,
          },
          // Runs this MoLang expression on the event-firing emitter
          "expression": <string>,
          // for debugging, this will log a message, along with the firing effect's name and event position
          // the log message will show up in the content logger
          "log": <string>
      }

    // simple example:
    "events": {
        "event_name1": {
            "particle_effect": {
                "effect": "a_particle_effect",
                "type": "emitter"
            }
        }
    }


现行的组件列表

在这些组件的字段里可使用下列标记:

<float> - 接受浮点数输入的字段
<float/molang> - 接受浮点数或MoLang表达式输入的字段
<default:val> - 如果字段未指定输入则使用指定的默认值
<bool> - true或false
<string> - 字符串
<default> - 不属于特定行的部分,如果字段未指定输入则使用其默认值

发射容器类组件(Emitter Components)

发射容器寿命类组件(Emitter Lifetime Components)

发射容器寿命表达式组件(Emitter Lifetime Expression component)

当表达式为非0时释放器将打开,当为0时关闭。这对于形如以一个行为变量来驱动一个实体关联性粒子释放器一类的情况用途显著。

"minecraft:emitter_lifetime_expression": {
    // When the expression is non-zero, the emitter will emit particles.
    // Evaluated every frame
    "activation_expression": <float/molang> <default:1>

    // Emitter will expire if the expression is non-zero.
    // Evaluated every frame
    "expiration_expression": <float/molang> <default:0>
}


发射容器循环执行组件(Emitter Lifetime Looping component)

粒子释放器将循环工作直到其被去除。

"minecraft:emitter_lifetime_looping": {

    // emitter will emit particles for this time per loop
    // evaluated once per particle emitter loop
    "active_time": <float/molang> <default:10>

    // emitter will pause emitting particles for this time per loop
    // evaluated once per particle emitter loop
    "sleep_time": <float/molang> <default:0>
}


发射容器单次执行组件(Emitter Lifetime Once component)

粒子释放器将执行一次。一旦粒子寿命结束或被允许释放的粒子数已被释放,释放器终止。

"minecraft:emitter_lifetime_once": {
    // how long the particles emit for
    // evaluated once
    "active_time": <float/molang> <default:10>
}

发射容器频率类组件(Emitter Rate Components)

发射容器即时释放组件(Emitter Rate Instant component)

所有粒子被一次释放,接下来除非释放器循环,否则行为结束。

"minecraft:emitter_rate_instant": {
    // this many particles are emitted at once
    // evaluated once per particle emitter loop
    "num_particles": <float/molang> <default:10>
}


发射容器手动释放组件(Emitter Rate Manual component)

粒子仅在其释放器被指示通过游戏来自主工作时被释放。这被那些已非现役的粒子效果广泛运用。

"minecraft:emitter_rate_manual": {
    // evaluated once per particle emitted
    "max_particles": <float/molang> <default:50>
}


发射容器稳定释放组件(Emitter Rate Steady component)

粒子随时间以一个稳定或合乎MoLang的比率被释放。

"minecraft:emitter_rate_steady": {
    // how often a particle is emitted, in particles/sec
    // evaluated once per particle emitted
    "spawn_rate": <float/molang> <default:1>

    // maximum number of particles that can be active at once for this emitter
    // evaluated once per particle emitter loop
    "max_particles": <float/molang> <default:50>
}

发射容器形状类组件(Emitter Shape Components)

形状控制粒子释放源的朝向及粒子的初始朝向。

发射容器自定义形状组件(Emitter Shape Custom component)

所有粒子都基于一个指定的MoLang表达式被释放。

"minecraft:emitter_shape_custom": {
    // specifies the offset from the emitter to emit the particles
    // evaluated once per particle emitted
    "offset": [<float/molang>, <float/molang>, <float/molang>] <default:[0, 0, 0]>

    // specifies the direciton for the particle
    // evaluated once per particle emitted
    "direction": [<float/molang>, <float/molang>, <float/molang>] <default:[0, 0, 0]>    
}


发射容器轴向边界盒形状组件(Emitter Shape Entity-AABB component)

所有粒子均从释放器所依附实体(当无实体时为释放点)的轴向边界盒(Axis-Aligned Bounding Box;AABB)被释放出。

"minecraft:emitter_shape_entity_aabb": {
    // evaluated once per particle emitted
    "direction": [<float/molang>, <float/molang>, <float/molang>] <default:[0, 0, 0]>    
}


发射容器偏移点组件(Emitter Shape Point component)

所有粒子均释放自来源于释放器的点状偏移。

"minecraft:emitter_shape_point": {
    // specifies the offset from the emitter to emit the particles
    // evaluated once per particle emitted
    "offset": [<float/molang>, <float/molang>, <float/molang>] <default:[0, 0, 0]>

    // specifies the direciton of particles.  
    // evaluated once per particle emitted
    "direction": [<float/molang>, <float/molang>, <float/molang>]
}


发射容器球体形状组件(Emitter Shape Sphere component)

所有粒子均释放自来源于释放器的球状偏移。

"minecraft:emitter_shape_sphere": {
    // specifies the offset from the emitter to emit the particles
    // evaluated once per particle emitted
    "offset": [<float/molang>, <float/molang>, <float/molang>] <default:[0, 0, 0]>

    // sphere radius
    // evaluated once per particle emitted
    "radius": <float/molang> <default:1>

    // emit only from the surface of the sphere
    "surface_only": <bool> <default:false>

    // specifies the direciton of particles.  Defaults to "outwards"
    "direction": "inwards" // particle direction towards center of sphere
    "direction": "outwards" // particle direction away from center of sphere
    // evaluated once per particle emitted
    "direction": [<float/molang>, <float/molang>, <float/molang>]
}

初始状态类组件(Initial State components)

发射容器本地空间组件(Emitter Local Space component)

这种组件指定了粒子释放器的参考框架,仅在释放器依附于实体时被应用。当“position”的布尔值为“true”时,粒子将模拟实体的形状,否则其将模拟世界的形状。控制转向的“rotation”工作模式相同。两者的默认布尔值均为“false”,使得粒子相对于释放器被释放,接着独立地模拟实体。需要注意的是,“rotation”及“position”的布尔值分别为“true”与“false”是非法设置。

"minecraft:emitter_local_space": {
    "position": <bool>
    "rotation": <bool>
}

颗粒类组件(Particle Components)

颗粒外形类组件(Particle Appearance Components)

颗粒告示牌组件(Particle Appearance Billboard component)

该组件能告知颗粒系统如何显示给玩家一个相对于游戏世界方向的镜头,以及该以怎么样的朝向呈现给该镜头。

"minecraft:particle_appearance_billboard": {
    // specifies the x/y size of the billboard
    // evaluated every frame
    "size": [<float/molang>, <float/molang>],

    // used to orient the billboard.  Options are:
    // "rotate_xyz" - aligned to the camera, perpendicular to the view axis
    // "rotate_y" -aligned to camera, but rotating around world y axis
    // "lookat_xyz" - aimed at the camera, biased towards world y up
    // "lookat_y" - aimed at the camera, but rotating around world y axis
    // "direction" - billboard is aligned perpendicular to the direction vector, 
    //    e.g. a direction of [0, 1, 0] would have the particle facing upwards
    "face_camera_mode": <string>

    // specifies the UVs for the particle.  
    "uv": {
        // specifies the assumed texture width/height
        // defaults to 1
        // when set to 1, UV's work just like normalized UV's
		// when set to the texture width/height, this works like texels
        "texturewidth": <int>,
        "textureheight": <int>,

        // Assuming the specified texture width and height, use these 
        // uv coordinates.  
        // evaluated every frame
        "uv": [<float/molang>, <float/molang>],
        "uv_size": [<float/molang>, <float/molang>],

        // alternate way via specifying a flipbook animation
		// a flipbook animation uses pieces of the texture to animate, by stepping over time from one 
		// "frame" to another
        "flipbook": {
            "base_UV": [ <float/molang>, <float/molang> ], // upper-left corner of starting UV patch
            "size_UV": [ <float>, <float> ], // size of UV patch
            "step_UV": [ <float>, <float> ], // how far to move the UV patch each frame
            "frames_per_second": <float>, // default frames per second
            "max_frame": <float/molang>, // maximum frame number, with first frame being frame 1
            "stretch_to_lifetime": <bool>, // optional, adjust fps to match lifetime of particle. default=false
            "loop":  <bool> // optional, makes the animation loop when it reaches the end? default=false
        }
    }
}


颗粒光源组件(Particle Appearance Lighting)

当存在该组件时,颗粒将在游戏中通过局部照明的方式来进行着色

"minecraft:particle_appearance_lighting": {}


颗粒外形着色组件(Particle Appearance Tinging component)
// color fields are special, they can be either an RGB, or a "#RRGGBB"
// field (or RGBA or "AARRGGBB").  If RGB(A), the channels are
// from 0 to 1.  If the string is "#RRGGBB" or "#AARRGGBB", the values are
// hex from 00 to ff.
//
// this pseudo-type will be denoted by <color>
"minecraft:particle_appearance_tinting": {
    // interpolation based color
    "color": {
        // an array of colors
        // it is assumed that the colors are equally spaced for interpolation
        // and that the range of the color interpolation values are 0 to 1
        //
        // for example, a 3 color "color" field with an interpolant value
        // of 0.5 would pick the second color
        "gradient": [ <color>, <color>, ...],
        "interpolant": <float/molang> // hint: use a curve here!
    }

    // directly set the color
    "color": <color>
}



颗粒初始状态类组件(Particle Initial State Components)

颗粒初始速度组件(Particle Initial Speed Component)

该组件控制粒子以一个指定的速度以及由释放器形状决定的朝向释放。

// evaluated once
"minecraft:particle_initial_speed": <float/molang> <default:0>


颗粒初始状态组件(Particle Initial State Component)

该组件控制粒子以一个指定的方位及转角释放。

"minecraft:particle_initial_spin": {
    // specifies the initial rotation in degrees
    // evaluated once
    "rotation": <float/molang> <default:0>

    // specifies the spin rate in degrees/second
    // evaluated once
    "rotation_rate": <float/molang> <default:0>
}

颗粒寿命类组件(Particle Lifetime Components)

方块中终止颗粒组件(Particle Expire If In Blocks component)

该组件控制粒子当处在列表列出的方块类型中时终止。注意:该组件可与particle_lifetime_expression并行。

"minecraft:particle_expire_if_in_blocks" [
    // minecraft block names, e.g. 'minecraft:water', 'minecraft:air'
    // these are typically the same name as in the /setblock command
    // except for the minecraft: prefix
    "blockname1",
    "blockname2", 
    ...
],


方块中不终止粒子组件(Particle Expire If Not In Blocks component)

该组件控制粒子当处在列表列出的方块类型中时不终止。注意:该组件可与particle_lifetime_expression并行。

"minecraft:particle_expire_if_not_in_blocks" [
    // minecraft block names, e.g. 'minecraft:water', 'minecraft:air'
    // these are typically the same name as in the /setblock command
    // except for the minecraft: prefix
    "blockname1",
    "blockname2", 
    ...
],


颗粒寿命表达式组件(Particle Lifetime Expression component)

标准的寿命组件。这些表达式控制粒子的寿命。

"minecraft:particle_lifetime_expression": {
    // this expression makes the particle expire when true (non-zero)
    // The float/expr is evaluated once per particle
    // evaluated every frame
    "expiration_expression": <float/molang> <default:0>
 
	// alternate way to express lifetime
    // particle will expire after this much time
    // evaluated once
    "max_lifetime": <float/molang>
},

颗粒运动类组件(Particle Motion Components)

颗粒运动碰撞组件(Particle Motion Collision component)

该组件使得地形与粒子能够产生碰撞。Minecraft中的碰撞监测包括监测二者的交集,为粒子移动到最近的非交集点(如果可能)并设置导向使其不会瞄准碰撞(通常是与碰撞表面垂直)。注意:若该组件不存在,碰撞将不会发生。

"minecraft:particle_motion_collision": {
    // enables collision when true/non-zero.
    // evaluated every frame
    "enabled": <bool/molang> <default:true>

    // alters the speed of the particle when it has collided
    // useful for emulating friction/drag when colliding, e.g a particle
    // that hits the ground would slow to a stop.
    // This drag slows down the particle by this amount in blocks/sec
    // when in contact
    "collision_drag": <float>

    // used for bouncing/not-bouncing
    // Set to 0.0 to not bounce, 1.0 to bounce back up to original height
    // and in-between to lose speed after bouncing.  Set to >1.0 to gain height each bounce
    "coefficient_of_restitution": <float>

    // used to minimize interpenetration of particles with the environment
    // note that this must be less than or equal to 1/2 block
    "collision_radius": <float>
}


颗粒运动动态组件(Particle Motion Dynamic component)

该组件指定了粒子的动态特性,即促使粒子行动的模拟立点。这些动态会改变由指向与速率共同决定的粒子的速度。粒子的指向将永远是粒子速度的方向。

"minecraft:particle_motion_dynamic": {
    // the linear acceleration applied to the particle, defaults to [0, 0, 0].
    // Units are blocks/sec/sec
    // An example would be gravity which is [0, -9.8, 0]
    // evaluated every frame
    "linear_acceleration": [<float/molang>, <float/molang>, <float/molang>],

    // using the equation:
    // acceleration = -linear_drag_coefficient*velocity
    // where velocity is the current direction times speed
    // Think of this as air-drag.  The higher the value, the more drag
    // evaluated every frame
    "linear_drag_coefficient": <float/molang> <default:0>

    // acceleration applies to the rotation speed of the particle
    // think of a disc spinning up or a smoke puff that starts rotating
    // but slows down over time
    // evaluated every frame
    // acceleration is in degrees/sec/sec
    "rotation_acceleration" <float/molang> <default:0>

    // drag applied to retard rotation
    // equation is rotation_acceleration += -rotation_rate*rotation_drag_coefficient
    // useful to slow a rotation, or to limit the rotation acceleration
    // Think of a disc that speeds up (acceleration) 
    // but reaches a terminal speed (drag)
    // Another use is if you have a particle growing in size, having
    // the rotation slow down due to drag can add "weight" to the particle's
    // motion
    "rotation_drag_coefficient" <float/molang> <default:0>
}


粒子运动参数组件(Particle Motion Parametric component)

该组件直接控制粒子。注意:该组件不工作于手动释放的粒子及基于实体且不处于本地空间的粒子释放器。

"minecraft:particle_motion_parametric": {
    // directly set the position relative to the emitter. 
    // E.g. a spiral might be:
    // "relative_position": ["Math.cos(Params.LifeTime)", 1.0, 
    //                       "Math.sin(Params.Lifetime)"]
    // defaults to [0, 0, 0]
    // evaluated every frame
    "relative_position": [<float/molang> <float/molang> <float/molang>]

    // directly set the 3d direction of the particle
    // doesn't affect direction if not specified
    // evaluated every frame
    "direction": [<float/molang> <float/molang> <float/molang]

    // directly set the rotation of the particle
    // evaluated every frame
    "rotation": <float/molang> <default:0>
}}

示例

火焰颗粒

这种形似微小火光的粒子见于火把熔炉来象征火焰。这种粒子很简单,包括一个固定不动的火光,仅有一些变化。注意:粒子行为的变量由MoLang语言创造。

此外,对于告示牌组件的UV节段中材质宽度/高度的运用允许经过材质像素对UV的参考:

{
  "format_version": "1.8.0",
  "particles": {
    "minecraft:basic_flame_particle": {
      "basic_render_parameters": {
        "material": "particles_alpha",
        "texture": "textures/particle/particles"
      },
      "components": {
        "minecraft:emitter_rate_instant": {
          "num_particles": 1
        },
        "minecraft:emitter_lifetime_once": {
          "active_time": 0
        },
        "minecraft:emitter_shape_sphere": {
          "radius": 0.025,
          "direction": [ 0, 0, 0 ]
        },
        "minecraft:particle_lifetime_expression": {
          "max_lifetime": "Math.random(0.6, 2.0) "
		},
		"minecraft:particle_appearance_billboard": {
			"size": [
				"(0.1 + variable.ParticleRandom1*0.1) - (0.1 * variable.ParticleAge)",
					"(0.1 + variable.ParticleRandom1*0.1) - (0.1 * variable.ParticleAge)"
			],
				"facing_camera_mode" : "lookat_xyz",
					"uv" : {
					"texturewidth": 128,
						"textureheight" : 128,
						"uv" : [0, 24],
						"uv_size" : [8, 8]
				}
		}
	  }
	}
  }
}


烟雾颗粒

该粒子为一种通用的烟雾团,常见于火把熔炉烈焰人等。这是一种带有包括上拉的上向加速度的上向运动。

这种粒子的主要特性与火焰颗粒的不同之处在于其翻页式的材质动画。见于下方的粒子细节,但其特效运用了一个告示牌组件中翻页式的子部分来驱动UV坐标随时间推移逐帧变换。

此外,对于告示牌组件的UV节段中材质宽度/高度的运用允许经过翻页式材质像素对UV的参考:

{
  "format_version": "1.8.0",
  "particles": {
    "minecraft:basic_smoke_particle": {
      "basic_render_parameters": {
        "material": "particles_alpha",
        "texture": "textures/particle/particles"
      },
      "components": {
        "minecraft:emitter_rate_instant": {
          "num_particles": 1
        },
        "minecraft:emitter_lifetime_once": {
          "active_time": 0
        },
        "minecraft:emitter_shape_custom": {
          "offset": [ 0, 0, 0 ],
          "direction": [ "Math.random(-0.1, 0.1)", 1.0, "Math.random(-0.1, 0.1)" ]
		},
		"minecraft:particle_initial_speed": 1.0,
			"minecraft:particle_lifetime_expression" : {
			"max_lifetime": "Math.random(0.4, 1.4)"
		},
			"minecraft:particle_motion_dynamic" : {
				"linear_acceleration": [0, 0.4, 0]
			},
				"minecraft:particle_appearance_billboard" : {
					"size": [0.1, 0.1],
						"facing_camera_mode" : "lookat_xyz",
						"uv" : {
						"texturewidth": 128,
							"textureheight" : 128,
							"flipbook" : {
							"base_UV": [56, 0],
								"size_UV" : [8, 8],
								"step_UV" : [-8, 0],
								"frames_per_second" : 8,
								"max_frame" : 8,
								"stretch_to_lifetime" : true,
								"loop" : false
						}
					}
				},
					"minecraft:particle_appearance_tinting": {
					"color": ["variable.ParticleRandom1*0.5", "variable.ParticleRandom1*0.5", "variable.ParticleRandom1*0.5", 1.0]
				},
					"minecraft:particle_appearance_lighting" : {}
	  }
	}
  }
}


生物火焰效果

该效果运用于烈焰人的火球充能状态中。这也是一种上向翻页式的效果。

这种粒子释放器通常基于实体,因为对火焰萦绕烈焰人周身的需要而允许物品轴向边界盒(AABB)形状的运用。该特效基于实体被创造/破坏,因而特效自身仅需要保持开启。

材质宽度/高度被用以使该效果的材质像素达到”一画一帧“,因此允许了这些帧的推进保持唯一:

{
  "format_version": "1.8.0",
  "particles": {
    "minecraft:mobflame_emitter": {
      "basic_render_parameters": {
        "material": "particles_alpha",
        "texture": "textures/flame_atlas"
      },
      "components": {
        "minecraft:emitter_local_space": {
          "position": true,
          "rotation": true
        },
        "minecraft:emitter_rate_steady": {
          "spawn_rate": "Math.random(15, 25)",
          "max_particles": 50
        },
        "minecraft:emitter_lifetime_expression": {
          "activation_expression": 1,
          "expiration_expression": 0
        },
        "minecraft:emitter_shape_entity_aabb": {
          "direction": [ 0, 1, 0 ]
        },
        "minecraft:particle_initial_speed": "Math.random(0, 1)",
        "minecraft:particle_lifetime_expression": {
          "max_lifetime": 1.25
        },
        "minecraft:particle_motion_dynamic": {
          "linear_acceleration": [ 0, 1.0, 0 ],
          "linear_drag_coefficient": 0.0
        },
        "minecraft:particle_appearance_billboard": {
          "size": [ 0.5, 0.5 ],
          "facing_camera_mode": "lookat_xyz",
          "uv": {
            "texturewidth": 1,
            "textureheight": 32,
            "flipbook": {
              "base_UV": [ 0, 0 ],
              "size_UV": [ 1, 1 ],
              "step_UV": [ 0, 1 ],
              "frames_per_second": 32,
              "max_frame": 32,
              "stretch_to_lifetime": true,
              "loop": false
            }
          }
        }
      }
    }
  }
}


跳动的气泡

该粒子生成一连串四处弹跳的气泡:

{
  "format_version": "1.8.0",
  "particles": {
    "minecraft:bounce": {
      "basic_render_parameters": {
        "material": "particles_alpha",
        "texture": "textures/particle/particles"
      },
      "components": {
        "minecraft:emitter_rate_instant": {
          "num_particles": 100
        },
        "minecraft:emitter_lifetime_once": {
          "active_time": 2
        },
        "minecraft:emitter_shape_sphere": {
          "offset": [ "Math.random(-0.5, 0.5)", "Math.random(-0.5, 0.5)", "Math.random(-0.5, 0.5)" ],
          "direction": "outwards",
          "radius": 1
        },
        "minecraft:particle_initial_speed": 5.0,
        "minecraft:particle_initial_spin": {
          "rotation": "Math.random(0, 360)",
          "rotation_rate": 0
        },
        "minecraft:particle_lifetime_expression": {
          "max_lifetime": "5"
        },
        "minecraft:particle_motion_dynamic": {
          "linear_acceleration": [ 0, -9.8, 0 ]
        },
        "minecraft:particle_motion_collision": {
          "coefficient_of_restitution": 0.5,
          "collision_drag": 4,
          "collision_radius": 0.1
        },
        "minecraft:particle_appearance_billboard": {
          "size": [ "0.1", "0.1" ],
          "facing_camera_mode": "rotate_xyz",
          "uv": {
            "texturewidth": 128,
            "textureheight": 128,
            "uv": [ 0, 16 ],
            "uv_size": [ 8, 8 ]
          }
        },
        "minecraft:particle_appearance_lighting": {}
      }
    }
  }
}
}

与颗粒实体的交互


基岩引擎中粒子释放的主要用途是释放与实体,如怪物,相关联的粒子,例如烈焰人 在攻击程式中燃起火焰,或唤魔者在召唤恼鬼时的魔咒效果。其目标是允许对关联于实体的粒子的约束及管理。

接下来的概念对于通过.json对其进行管理十分重要:
- 效果列表 它们与材质等一同存在于实体的资源定义.json文件中。它们列出了可用于实体的效果,伴有一个针对效果的内部实体名称,以及将要进行的关联效果。
- 定位器 它们存在于几何文件中并指定了一个几何位置。这些定位器可被关联于主架构,因而可以在动作时跟随主架构。
- 基于动画控制器的颗粒管理 利用动画控制器形态的机械概念,一触而发的以及持续的粒子效果都可以被启动。
- 动画时轴颗粒管理 因其为实体动画.json文件的一部分,我们可以设置一条在动画播放时于特定时间触发粒子效果的时间轴。 需要注意:其仅需要动画的.json结构,而非实际的物理动画。

关联于实体的粒子本质上是与实体绑定的。若该实体终止其存在,则粒子效果也会随之终止。释放器跟随于实体或实体的定位器。

效果列表(Effect Lists)

该列表列出了实际粒子效果捆绑的内部粒子名称,为给实体加入粒子效果的通用形式。列表中包含有实际粒子效果简称的清单。所有效果的参考运用其在动画及动画控制器中的简称。注意:其本身并不会使粒子效果出现。

{
  "format_version": "1.8.0",
  "minecraft:client_entity": {
    "description": {
      "identifier": "minecraft:entity_name",
      ...
       "particle_effects": {
            "shorthand_name1": "effect_name1",
            "shorthand_name2": "effect_name2",
        },
        ...
    }
  }
}



以下这个例子展示了烈焰人的燃焰效果。我们可以在实体的资源定义文件中的“description”节段内增添一个具有name/value对的“particle_effects”节段。“name”是其他.json文件会参考到的名称,而“value”是由粒子效果的.json文件指定的其本身的名称。

{
  "format_version": "1.8.0",
  "minecraft:client_entity": {
    "description": {
      "identifier": "minecraft:blaze",

      ...

       "particle_effects": {
            "charged_flames": "minecraft:mobflame_emitter"
        },

        ...

    }
  }
}


效果事件(Effect Events)


实体中的效果事件具有以下特性:
- “effect”是由实体的资源定义.json文件(粒子效果列表)所指定的效果名称。它指定了何种粒子效果应被启动或播放。
- “locator”是一个用以定向资源定义文件中同名定位器的可选参数。通过指定定位器,粒子释放器将会在实体动画进行时绕跟该定位器,包含其方向。如果其未被指定,效果将在实体原位置产生。
- “pre_effect_script”是一个在粒子释放器启动时运行的可选参数,其本质为一个MoLang表达式。它可以设置随后可被粒子效果的.json文件内部参考到的MoLang变量(例如“particle color”,即粒子颜色)。

{
    "effect": "internal_name",
    "locator": "locator_name", // optional
    "pre_effect_script" // optional
}


动画控制器效果(Animation Controller Effects)


动画控制器可以为效果的状态指定其效果事件。这将允许粒子效果的列表在状态进入时被启动,以及在粒子效果脱离该状态时被自动停止。对于那些不终止(或不在其状态转换前终止)的粒子,它们将在脱离状态时被终止。

其模式为:
"particle_effects": [
// array of effect events
]
这组阵列语法允许多于一种效果在状态进入时被触发。

下面将给出的例子是烈焰人在其动画控制器中的燃焰效果。这种动画控制器共有两层状态:“default”及“flaming”。控制器通过“query.is_charged”这一实体标示检查在两种状态间转换。当处于“flaming”状态时,“charged_flames”效果启动(不带有定位器或初始化MoLang表达式),且在脱离状态时被终止。

{
  "format_version": "1.8.0",
  "animation_controllers": {

    ...

    "controller.animation.blaze.flame": {
      "states": {
        "default": {
          "transitions": [
            { "flaming": "query.is_charged" }
          ]
        },
        "flaming": {
          "particle_effects": [
            {
              "effect": "charged_flames"
            }
          ],
          "transitions": [
            { "default": "!query.is_charged" }
          ]
        }
      }
    },

    ...

  }
}




以下例子展示了另一个唤魔者的魔咒效果。它促使唤魔者以其左手和右手的定位器来执行两个“spell”(魔咒)效果。魔咒效果自身是连续性的,故粒子释放器会在唤魔者停止施咒前一直保持工作。

{
  "format_version": "1.8.0",
  "animation_controllers": {
    "controller.animation.evoker.general": {
      "states": {
        "default": {
            ...
          "transitions": [
            { "casting": "query.is_casting" }
          ]
        },
        "casting": {
            ...
          "particle_effects": [
            {
              "effect": "spell",
              "locator": "left_hand"
            },
            {
              "effect": "spell",
              "locator": "right_hand"
    	    }
          ],
          "transitions": [
            { "default": "!query.is_casting" }
          ]
        }
      }
    }
  }
}


动画时轴效果(Animation Timeline Effects)

动画本身亦可触发粒子效果。这均为一些“一键无忧”式的,与时间轴绑定的效果。当动画抵达某个时间点时,(一个或多个)效果即会被触发。

"particle_effects": {
    "time1" : [
        // array of effect events
    ],
    "time2" : [
        // array of effect events
    ],
    "time3" : {
      // single effect
    }
}



“time1”“time2”等等是数值化的时间点(例如“0.0”)。

在下面的例子里,猫咪坐下3秒后,一个烟雾团会被生成。

{
  "format_version": "1.8.0",
  "animations": {
    ...
    "animation.cat.sit": {
      "loop": true,
      "animation_length": 5.0,
      "bones": {
          // bone animation stuff
       },
      "particle_effects": {
        "3.0": [
          {
            "effect": "smoke_puff"
          }
        ]
      }
    },
    ...
    }
  }
}

另见

Advertisement