Skip to content
粒子发射器

粒子发射器

INFO

阅读本文预计 15 分钟

本文概述了 游戏功能对象——粒子发射器的使用方法。

1. 什么是粒子发射器?

  • 粒子发射器是能发射粒子的特效单元,可以修改各种属性实现丰富的特效表现。
  • 粒子发射器属于自定义特效,可以修改多种属性,甚至是贴图。非自定义特效是定制化的UE特效,可修改参数少,但是完成度高。实际项目中可以根据需要选择特效类型。

2. 如何创建粒子发射器?

  • 将发射器从功能组件中拖出到场景或对象管理器中,选中粒子发射器后可以在面板中更改属性。 image

3. 粒子发射器有哪些属性和接口?

3.1 变换

image

3.1.1 相对位置:粒子发射器在世界中的位置。

3.1.2 相对旋转:粒子发射器在世界中的旋转。

3.1.3 相对缩放:固定为(1,1,1),无法更改。

效果演示:

20240723133937_rec_

3.2 效果属性

3.2.1 启用:打开时,粒子发射器会在游戏启动时发射粒子,反之则不会。暂停按钮可以让粒子发射器在编辑器中暂停发射。该属性仅可在编辑器中修改。

image

TIP

脚本中使用ParticleEmitter.play()开始发射粒子,使用ParticleEmitter.stop()停止发射粒子,使用ParticleEmitter.forceStop()停止发射并销毁所有已经发射的粒子。

3.2.2 颜色:控制粒子在生命周期中的颜色以及变化。

image

TIP

如上这种数据形式为“关键帧插值”,在粒子发射器中被频繁使用,以实现丰富的效果。 使用方法:

  1. 点击加号新增关键帧节点。
  2. “时间点”属性为粒子从诞生到被销毁整个生命周期中的百分比。
  3. “值”可以为颜色、透明度甚至加速度等,代表粒子会从上个“时间点”的该属性向当前值变化。
  4. 脚本中实现关键帧插值请见如下代码示例。
TypeScript
// 在脚本中实现关键帧插值
let Effect = this.gameObject as ParticleEmitter;

// 创建粒子颜色的关键帧数组 效果为由蓝线性过度至红色
let ColorSequence = Array<mw.colorSequencePoint>();
// 生命周期0%时为蓝色
ColorSequence.push(new mw.colorSequencePoint(0, new LinearColor(1,0,0)));
// 生命周期100%时为红色
ColorSequence.push(new mw.colorSequencePoint(1, new LinearColor(0,0,1)));
Effect.color = ColorSequence;
// 在脚本中实现关键帧插值
let Effect = this.gameObject as ParticleEmitter;

// 创建粒子颜色的关键帧数组 效果为由蓝线性过度至红色
let ColorSequence = Array<mw.colorSequencePoint>();
// 生命周期0%时为蓝色
ColorSequence.push(new mw.colorSequencePoint(0, new LinearColor(1,0,0)));
// 生命周期100%时为红色
ColorSequence.push(new mw.colorSequencePoint(1, new LinearColor(0,0,1)));
Effect.color = ColorSequence;

效果演示:

20240723143028_rec_

3.2.3 亮度:控制粒子的亮度。默认值1。

image

效果演示:

20240723144533_rec_

3.2.4 光照影响:控制粒子收到环境光照影响的程度,0到1代表完全不受影响到完全受影响。默认值0。

image

效果演示:

20240723144927_rec_

3.2.5 透明度:控制粒子的透明度,支持“关键帧插值”,默认值1。

image

效果演示:

20240723145734_rec_

3.2.6 贴图:单个粒子的贴图,目前仅适配场景贴图。

image

效果演示:

20240723150305_rec_

3.2.7 大小:控制粒子的大小,支持“关键帧插值”,默认值1。

image

效果演示:

20240723150846_rec_

3.2.8 宽高比:控制粒子的宽高比,默认值0。

image

效果演示:

20240723151207_rec_

3.3 释放属性

3.3.1 生命周期:控制粒子从诞生到销毁的时间,X和Y代表区间,当相同时,生命周期恒定,当不同时,生命周期会在二者中间随机,默认值(10,10)。

image

效果演示:

20240723151740_rec_

3.3.2 发射频率:控制粒子的发射频率,单位“个/秒”,范围0-100,默认值20。

image

TIP

如果单个粒子发射器所发射出去但仍未被销毁的粒子达到了1000个,那么就会自动减缓发射频率,以保证数量维持在1000以内。 如果您需要大片粒子的效果,不妨将多个粒子整合为单张图片以减缓渲染压力。 如果效果仍不理想,可以试试堆叠多个粒子发射器。

效果演示:

20240723152446_rec_

3.3.3 速度:控制粒子的速度,单位“厘米/秒”。

image

效果演示:

20240723155139_rec_

3.3.4 加速度:控制粒子在生命周期中的加速度,支持“关键帧插值”。

image

效果演示:

20240723160413_rec_

3.3.5 初始旋转角度:控制粒子在发射时的初始旋转角度,默认值0。

image

效果演示:

20240723162651_rec_

3.3.6 旋转速度:粒子在生命周期过程中旋转的速度,支持“序列帧插值”。

image

效果演示:

20240723163015_rec_

3.3.7 扩散角度:粒子偏离发射垂直方向的角度

image

效果演示:

20240723163500_rec_

3.4 发射器属性

3.4.1 形状范围:当前版本粒子发射器仅支持矩形,XYZ表示矩形的长宽高。默认值(50,50,50)。

image

TIP

在矩形粒子发射器下,缩小XYZ可以实现粒子从单个点发射;缩小一个一个值,放大其他两个值,可以实现方形平面发射的效果等。 通过

效果演示:

20240723163918_rec_

3.4.2 形状样式:分为仅表面发射和体积内发射,仅表面发射代表粒子只会从发射器的表面生成,体积内发射代表粒子会从发射器内部生成。默认为体积内发射。

image

效果演示:

体积内发射仅表面发射
20240724093017_rec_20240724093128_rec_

3.5 其他属性

3.5.1 阻力:粒子从发射开始速度衰减到0的速率,计算公式“粒子速度 += 粒子速度 * -阻力 * DeltaTime”,取值范围0-1,默认值0。

image

效果演示:

阻力 = 0.3阻力 = 1
20240724104350_rec_20240724104456_rec_

3.5.2 遮罩半径:设置粒子的边缘遮罩裁剪,取值范围0-1,默认值0.5。

image

效果演示:

20240724104043_rec_

4. 粒子发射器的使用建议

  • 需要发射大量粒子时,可以考虑将多个粒子合成一张图片,减少渲染压力。
  • 注意粒子的生命周期,如果长时间未销毁粒子,可能会影响新发射的粒子数量。
  • 粒子发射器可以制作大量效果,如落叶,雨雪,升级特效,脚底行走特效等。但是需要注意实现方法,如下,实现雨雪效果时,可以考虑将粒子发射器挂载在摄像机中而不是世界中。
TypeScript
// 脚本中将粒子发射器挂载在摄像机上
@Component
export default class EffectExample extends Script {
    private character: Character;
    
    protected onStart(): void {

        let Effect = this.gameObject as ParticleEmitter;
        Player.asyncGetLocalPlayer().then((player) => {
            Effect.parent=Camera.currentCamera
            Effect.localTransform.position=new Vector(0,0,50)
        });
    }
}
// 脚本中将粒子发射器挂载在摄像机上
@Component
export default class EffectExample extends Script {
    private character: Character;
    
    protected onStart(): void {

        let Effect = this.gameObject as ParticleEmitter;
        Player.asyncGetLocalPlayer().then((player) => {
            Effect.parent=Camera.currentCamera
            Effect.localTransform.position=new Vector(0,0,50)
        });
    }
}

效果演示:

20240724103814_rec_