Table of Contents

教程:激光与闪电

中级 美术 程序员

本教程解释如何使用粒子和自定义材质创建激光和闪电。

假设我们想创建一个这样的闪电弧:

media/particles-tutorials-lasers-1.gif

这个效果是一个条带,它:

  • 连接两个固定点

  • 非常快速地改变位置

  • 可以作为单个条带渲染

由于闪电是单线条带,我们可以使用缎带形状构建器来渲染它,但有一些主要区别。粒子:

  • 同时生成,而不是按顺序生成

  • 出现在单条直线或圆弧上,但带有半随机的位置,以营造闪电的错觉

  • 应该非常快地重新出现

同时生成

我们可以创建一个循环的按帧生成器,它每帧生成一定数量的粒子(假设是 50 个)。

由于我们一次只需要显示一组粒子,我们将发射器上的 Maxmimum Particles 限制为 50,并给它们相同的寿命(例如 0.2 秒)。

这意味着生成器每帧会尝试发射 50 个粒子,但由于我们限制了它,它只会在第一帧生成 50 个粒子。

它们都有相同的寿命,所以当它们同时死亡时,新的一批 50 个粒子将被生成。

连接两个点

我们将使用 Position (Arc) 初始化器。它从另一个 Entity 获取第二个点,并将粒子的位置设置在发射器和目标 Entity 之间的圆弧上。

通过点击 Ordered 复选框,我们可以强制粒子从发射器开始向目标 Entity 方向以等距放置。 当我们使用 Ribbon 形状构建器渲染它们时,这一点很重要,因为如果它们出现在圆弧上随机(未排序)的位置,将会是一团糟。 我们还必须添加 Spawn Order 初始化器并按 Order 对粒子排序(这对所有缎带都适用,不仅仅针对闪电)。

圆弧位置初始化器还允许随机偏移,我们将其设置为某个小数值。

快速改变位置

我们可以将粒子的寿命设置为一个较小的数字(例如 0.2 秒)。通过 Time scale 参数,我们还可以控制整个粒子系统的速度。

为了更好地说明发生了什么,下面是用 Billboard 形状构建器代替 Ribbon 的同一效果,并放慢了 30 倍:

media/particles-tutorials-lasers-2.gif

移动的闪电

有一种方法可以让闪电弧从点 A 移动到点 B,而不是保持静止。

media/particles-tutorials-lasers-3.gif

我们需要做一些调整:

  • 将生成速率改为更低的值。上面的示例使用 600/秒,并以 0.1 的时间缩放播放,这意味着每帧约 1 个粒子。

  • 在圆弧定位器上设置固定数量(50)。因为它会根据每帧生成的粒子数量来插值距离,如果我们按顺序生成它们,它们都会停留在圆弧的开头。通过将数量设置为 50,我们告诉圆弧定位器预期总共有 50 个粒子。

  • 给生成器设置一个延迟,让旧的圆弧在重新开始之前完全消失。否则缎带会错误地连接旧粒子和新粒子,因为它无法知道如何区分它们。

使用粒子制作激光

用粒子制作激光与制作闪电非常相似。我们实际上需要更少的粒子,因为激光是笔直的,不会偏离。 通过将圆弧定位器的弧高设置为 0,随机偏移设置为 (0, 0, 0),我们可以让粒子生成在一条直线上。如果愿意,你可以给它们略微不同的大小,使激光束看起来微微闪烁。

关于激光需要注意的一点是,通常当目标移动时,你希望激光也随之移动。因为圆弧定位器是一个初始化器而不是更新器,它对已经生成的粒子没有影响,这些粒子会留在原地。有三种方法可以解决这个问题。

  • 非常快地生成粒子。如果它们只存活 1-2 帧,激光重新创建的速度会快到用户无法注意到任何视觉差异。

  • 在 Local 空间中生成粒子。这意味着它们会随发射器一起移动,但然后你必须旋转和缩放发射器以始终指向目标 Entity。

  • 创建自定义 Updater。如果你创建一个类似(或更简单的)圆弧定位器的自定义后置更新器,你可以强制它每帧更新粒子位置,即使它们移动也能正确地将它们放置在两点之间。

根据你想要制作的游戏类型,这些选项各有优缺点。每帧生成粒子是最简单、最直接的方式,对于大多数需求来说已经足够了。

使用自定义材质制作激光

使用自定义材质制作激光与在 Local 空间中使用粒子类似。我们需要手动旋转和缩放发射器,使其始终面向目标实体。

我们可以指定一个指向目标的轴作为长度,将另外两个轴留给激光的宽度。

在旋转后的实体下方渲染一个高度为 1 的圆柱体,会使它拉伸并到达目标点。

自定义材质需要在圆柱体上放置一个滚动纹理。或者,你可以使用没有滚动的常规 Emissive 贴图,这样就不需要自定义材质了。

粒子示例已经包含了如何用这种方式创建激光的例子。LaserOrientationScript 将实体旋转和缩放朝向目标点,而 ComputeColorTextureScroll 着色器对滚动纹理进行采样。

示例项目

要在项目中查看本页面描述的一些技术,请创建一个新的 Sample: Particles 项目并打开 Lasers 场景。

粒子示例项目

另请参阅