粒子效果

从焰火火箭留下烟雾,到鱼嘴里冒出的气泡,粒子是为《我的世界》基岩版中的内容添加特殊效果的好方法。

图像显示艾莉克斯拿着一根魔杖,魔杖散发出一系列火花和智慧之星

在本教程中,您将学习以下内容:

  • 如何在《我的世界》基岩版中创建自定义粒子效果。
  • 如何制作新的粒子效果以在您的地图或加载项中使用。

要求

在开始本教程之前,建议完成以下内容。

简介

粒子用例

粒子是增强地图或加载项视觉体验的强大工具。 它们可用于实体的排气烟雾等环境效果、魔咒等攻击效果,以及其他动画。 粒子也可用于地图中的环境效果,例如落叶。 您还可以使用粒子在您的世界中放置简单的 2D 图形。 此外,粒子通常比自定义实体的性能更高,因为它们完全是在客户端模拟的。

命名和位置

基岩版的粒子效果使用自定义 JSON 格式。 文件存储在资源包的 particles 文件夹中。 与模型和实体类似,粒子由其标识符引用,因此您可以将文件保存在 particles 文件夹内的任何子文件夹中,而不必担心引用问题。

粒子标识符在 JSON 文件的顶部指定。 与实体类似,标识符应由命名空间和名称组成,例如 compass:colored_smoke

    "description": {
    "identifier": "compass:colored_smoke",
    },

单位

粒子效果中的所有值都使用(方块数)和作为单位。 速度表示为米每秒 (m/s),加速度表示为 m/s 每秒 (m/s²)。 旋转使用,用于旋转和三角函数。

Snowstorm

在本指南中,我们将使用 Snowstorm 来创建粒子效果。 Snowstorm 可用作 VSCode 的 Web 应用扩展。 它支持在更改参数时实时预览粒子效果。 Web 应用对初学者很有用,但对于具有大量粒子效果的项目,VSCode 扩展会提供更快的工作流程。

界面

打开 Snowstorm 时,您将看到 3D 预览部分、侧边栏、菜单栏和菜单下方的表达式栏。

Snowstorm 界面

侧边栏是组成粒子的所有不同参数和设置的列表。 许多字段都支持 Molang。 这意味着您可以输入静态数字,若要对字段值有更多的控制,也可以使用 Molang 语言的数学表达式。 将鼠标悬停在每个字段上可查看其功能描述。

如果您采用一个非常复杂的 Molang 表达式,还可以在菜单正下方的表达式栏中对其进行编辑。

Snowstorm 中的表达式栏

菜单栏用于在 Web 应用中导入和导出文件、加载示例或查看参考。

在表达式栏下方,您可以看到预览屏幕。 您可以使用鼠标左键和右键以及鼠标滚轮在 3D 空间中导航,使用下面的按钮开始或暂停预览。 在右下角,您将看到场景中的 FPS 和当前粒子数。

导入和导出

如果您使用的是 Web 应用,则必须通过 File 菜单导入和导出文件。 您也可以切换到右上角的 Code 选项卡来预览生成的文件。

Snowstorm 中的 Code 选项卡

如果您使用自定义材质,则必须在侧边栏的 Textures 部分单独加载这些材质。

Snowstorm 中的材质选择

如果您使用的是 VSCode 扩展,请在 particles 文件夹中创建一个名为 <name>.particle.json 的新文件,VSCode 将自动使用 Snowstorm 编辑器打开。 您也可以点击右上角的 Open Code,在新标签页中预览生成的代码,甚至可以直接在这里编辑代码。

创建粒子效果

在本指南中,我们将逐步创建一个彩色烟雾效果。 首先,打开 Snowstorm 并在侧边栏中找到 meta 部分。 输入粒子效果的标识符 – 我们将使用 compass:colored_smoke

Snowstorm 中的标识符

发射器

创建粒子的最终结果

现在,我们将更改发射器。 发射器是粒子效果的核心,负责生成粒子。 首先,我们需要打开 Rate 部分并定义生成的粒子数量。 我们将模式设置保留为 Steady,这意味着发射器将不断产生粒子,我们将速率设置为 30,最大值设置为 100。 这意味着发射器在其生命周期内每秒将生成 30 个粒子,只要世界上不超过 100 个来自该发射器的粒子。

Snowstorm 中的发射率

接下来,我们将定义发射器寿命。 我们只想播放一次该粒子效果,但如果您需要一个持续的发射器,可以将其设置为循环播放。 我们还将 Active Time 设置为 2,这意味着发射器生成粒子两秒钟。

Snowstorm 中的发射器寿命

默认情况下,粒子将在发射器中心的单个点处生成。 这对我们的粒子效果来说很好,所以我们不需要在 Shape 部分更改任何内容。

粒子大小

我们现在将转到粒子设置并配置外观设置。 所有粒子都是一个应用了材质的 2D 平面。 在大小设置中,我们可以定义这个平面的宽度和高度,其中每个值都是半径。 这意味着将大小设置为 1 x 1 会使其大小为 2 x 2 的方块。 在本例中,我们将使用 0.25 x 0.25。

Snowstorm 中的粒子大小

粒子运动和物理学

下一步是定义粒子如何移动。 在 Motion 部分,我们将 Direction 模式设置为 Outwards。 这对于点发射器始终意味着粒子将均匀地扩散到所有方向。

Snowstorm 中的粒子运动

现在粒子有了初始方向,我们来改变速度。 在 Motion 部分,我们将 Speed 设置为 math.random(2, 4)。 这是一个简单的数学表达式,它将始终输出 2 到 4 之间的随机十进制数。 速度只在粒子生成时计算一次,所以现在,我们的每个粒子都有一个随机的初速度。

Acceleration 定义粒子生成后作用在粒子上的力。 例如,要模拟地球上的重力,您可以将中间值(Y 轴)设置为 -9.8。 对于我们的烟雾,我们将使用 030 作为加速度来缓慢向上移动。

现在,加速度将使我们的粒子以指数方式加速。 为了让它们在一段时间后减速并保持在一个空间内,我们将添加空气阻力。 您可以把它想象成浓稠的空气,当粒子达到其最终速度时,它会缓慢降低加速度。 我们暂时将其设置为 2

为了让空气阻力有更多的变化,让我们随机化这个值。 空气阻力表达式每帧计算一次,因此在这种情况下使用数学随机函数不起作用,因为随机值会悄然相互抵消。 相反,我们将使用一个内置变量。 每个粒子和每个发射器将自动分配 4 个随机变量,在其生命周期内始终使用。 变量包含一个介于 0 和 1 之间的随机数。 因此,要实现从 2 到 3 的随机空气阻力值,我们将值设置为 2 + variable.particle_random_1

粒子寿命

现在,我们要定义粒子在世界中存在的时间。 为了获得缓慢的淡出效果,我们将再次随机化这个数字。 由于 Max Age 在粒子生成时只计算一次,这就像将其值设置为 math.random(1, 3) 来实现这一点。

Snowstorm 中的粒子寿命

材质

您可以为粒子创建自己的粒子材质,并将其保存在资源包的 textures 文件夹中。 为简单起见,我们将在本例中使用默认的《我的世界》粒子精灵。 要引用此材质,请在 Texture 部分的 Path 字段中键入 textures/particle/particles。 因为将默认使用原版材质,即使该材质不在您当前的材质包中,也将自动加载并显示在游戏中。

Snowstorm 中的粒子材质和动画选项

我们将使用的粒子材质是最大的烟雾粒子。 由于我们希望为材质设置动画,使其逐渐变为较小的烟雾粒子大小,因此将 UV Mode 设置为 Animated

整个材质贴图(包括所有粒子的材质)的分辨率为 128 x 128 像素。 精灵上的大多数单个片段的尺寸为 8 x 8 像素。 但是,这些值按比例增加了 2 倍。 因此 Texture Size 最终将是 16 x 16 像素,其余选项将基于该大小。

最大烟雾粒子的起始像素为水平 56 个像素,放大 2 倍至 112。 由于在此上下文中材质是 16 x 16,将 112 除以 16 得到 7,这是 UV Start 字段的值。 或者,您可以计算出现在起始材质之前的材质数量(有 7 个材质出现在最大的烟雾粒子之前)。 但是,如果有很多空白空间,手动计算材质可能会更加困难。

由于动画涉及到更小的烟雾材质,UV Step 将被设置为 -10。 这意味着它将相对前一个材质向左移动 16 个像素(基于材质大小),不会垂直移动。 我们还将 Max Frame 设置为 7。 动画将有 8 帧,因为有 8 个材质,第一帧被算作“第 0 帧”,所以最后一帧是第 7 帧。

在这种情况下,我们希望在粒子的整个生命周期内平均分布所有帧。 因此,我们将 FPS 字段留空,不选中 Loop,但选中 Stretch To Lifetime。 这样,我们的动画材质就可以使用了。

颜色

现在,我们想对粒子应用随机颜色。 基础材质是白色的,这对于粒子着色是一个很好的起点。

Snowstorm 中的粒子颜色

我们将使用一系列不同的颜色,每个粒子将选择一个随机值。 首先,打开 Color & Light 部分并选择 Gradient 模式。 我们在这里配置一个漂亮的、简单的彩虹。 您可以使用 + 图标添加颜色点、移动改每个点的颜色。

默认颜色范围介于 0 和 1 之间。 这意味着我们现在可以简单地使用另一个内置随机变量来选择随机颜色。 我们将在 Interpolant 字段中输入 variable.particle_random_2。 现在,每个粒子将以渐变的随机颜色生成。

最终结果应该类似于如下 Snowstorm 中的样子:

Snowstorm 中创建的粒子的最终结果

在游戏中使用粒子效果

在游戏中主要有以下三种方式播放粒子效果:

命令

这是测试效果最简单的方法。 使用 /particle 命令即可将粒子发射器召唤到世界中。

备注

因为粒子效果完全在客户端,而命令在服务器端运行,所以服务器不知道粒子效果。 这意味着如果您尝试播放不存在的粒子效果,将不会收到错误消息。

这是一个示例命令:命令末尾的三个波浪号表示位置,在这种情况下是执行命令的确切位置,因此是玩家的脚位置或运行命令的命令方块的中心。

/particle compass:colored_smoke ~ ~ ~

动画

粒子也可以在实体动画中播放。 这是一个两步过程。 首先,您需要在客户端实体文件中链接粒子效果并为其指定一个短名称。 然后,您可以在动画中使用该短名称。

将下面的内容添加到客户端实体文件中的 description 对象内:

"particle_effects": {
    "smoke": "compass:colored_smoke"
}

粒子效果关键帧可以添加到 Blockbench 中的动画中。 点击时间轴上方的 Animate Effects 按钮并将关键帧添加到 Particle 通道。 现在,在关键帧面板的 **Effect ** 输入中输入短名称(在客户端实体文件中定义)。

您还可以在将出现粒子效果的实体文件中指定一个定位器。 您还可以在 Script 输入中分配一个变量,稍后可以在粒子效果中使用该变量。

示例:

variable.custom_size = 3.14;

动画控制器

粒子效果也可以由动画控制器播放。 为此,首先将粒子效果添加到您的客户端实体文件中,如上所述。 接下来,将一个或多个粒子效果添加到动画控制器的特定状态,如下例所示:

"particle_effects": [
    {
        "effect": "smoke"
    }
]

下一步内容?

恭喜,您已阅读到文章的结尾! 您已经学习了如何创建自定义粒子效果、如何配置发射器、更改物理、如何使用动画材质以及如何为其着色。

创建粒子效果就是反复试验,组合不同的设置,并使用 Molang 表达式来增强参数。 要了解更多信息,我们鼓励您查看示例粒子并查看配置以了解如何使用不同的值和表达式来创建效果。 而且,最重要的是,尝试有参数,祝您玩得开心,看看您能实现什么。