【UE4】NiagaraSystem / ParticleSystem 自动添加 Module

本文记录在 Niagara 和 Cascade 编辑器中分别对 NiagaraSystem 和 ParticleSystem 特效的发射器自动添加 Module 的方法,目的在于批量、自动添加美术(或程序)所需的模块,便于美术做通用效果,便于程序做通用接口

一、背景

  Particle 和 Cascade (ParticleSystem 的编辑器的名称)相关知识和术语可以参考:ParticleSystem
  Niagara 编辑器与 Cascade 表现上看结构类似,但是实际复杂很多,大体结构都如下图所示:
在这里插入图片描述

  都是 Parameters -> Modules -> Emitters -> System 的四层结构,其中:

  • System - 指的就是这整个特效资源
  • Emitters - 指每一个发射器(由他们控制发射粒子,不管是 Sprite、Mesh、Ribbon 还是其他),编辑器中竖着的一整条
  • Modules - 指每一个模块,控制发射器的不同属性和功能,编辑器中每一个横着的一条
  • Parameters - 指每一个模块中的参数,可以由美术人员配置,也可在程序中由程序控制

  其中:

  • System - 运行时会变成 Component,ParticleSystem 创建出 UParticleSystemComponent,NiagaraSystem 创建出 UNiagaraComponent
  • Emitters - 静态时是 UParticleEmitterUNiagaraEmitter,运行时就是 FParticleMeshEmitterInstanceFNiagaraEmitterInstance
  • Modules - Particle 的都是代码写死的,都在 Engine\Source\Runtime\Engine\Classes\Particles 文件夹下,可以用的就只有这么多种,比如图中的 ColorOverLife 代码中就是 UParticleModuleColorOverLife;而 Niagara 的是资产,可以认为都是蓝图,引擎自带的都在 Engine\Plugins\FX\Niagara\Content\Modules 目录下,当然也可以自己连一下自己用,作为自己项目的资产,非常灵活好用。
  • Parameters - 可以配置的参数,Cascade 也都是固定的,如果像开给外部,让蓝图或者程序设置,可以像下图这样设置成 Parameter 即可,蓝图或者代码就可以 SetVectorParameter("ABC", DummyVec); 这样控制了;Niagara 不太一样,需要在 UserExposed 中添加一个参数,并且把参数和想用的输入关联上之后,在外部控制(外部只能设置 User Expoosed 的参数,感觉很不爽= =)

在这里插入图片描述

二、具体方法

  两种特效进行自动添加 Module 的前提都是在代码中能拿到这个特效资源,不管是在 Content Browser 中打开还是多选,保存时触发还是有按钮统一执行,都可以(Niagara 可能不行,需要把编辑器打开)。

2.1 ParticleSystem

参考在 Cascade 中右键新增一个 Emitter 时的代码:void FCascade::OnNewEmitter(),会自动添加几个默认的 Module(UParticleSpriteEmitter::SetToSensibleDefaults()),比如 Life,直接照抄引擎即可:

// Lifetime module
UParticleModuleLifetime* LifetimeModule = NewObject<UParticleModuleLifetime>(GetOuter());
UDistributionFloatUniform* LifetimeDist =
Unreal Engine 4中为粒子系统添加LOD(Level of Detail,细节层次)设置,可以通过以下步骤实现。LOD的设置能够根据摄像机与粒子系统的距离动态调整粒子效果的复杂度,从而优化性能。 ### 配置粒子系统的LOD设置 1. 打开 **Particle System Editor**(粒子系统编辑器),选择需要调整的粒子系统。 2. 在编辑器的顶部工具栏中,找到 **LOD Settings**(细节层次设置)部分。 3. 点击 **Add LOD Level**(添加LOD层级)按钮来创建多个LOD级别。通常,LOD 0是最高的细节层级,随着层级编号增加,细节逐渐降低。 4. 对于每个LOD层级,可以调整以下参数: - **Screen Size**(屏幕大小):定义该LOD层级何时生效,基于粒子系统在屏幕上的大小。 - **LOD Level**(LOD层级):选择当前编辑的层级。 - **LOD Bias**(LOD偏移):调整LOD切换的灵敏度。 5. 对于每个层级,可以单独调整粒子发射器的模块参数,例如: - **Birth Rate**(生成速率):减少粒子数量以降低性能消耗。 - **Particle Lifetime**(生命周期):缩短或延长粒子存在时间。 - **Velocity**(速度):调整粒子的运动速度以简化计算。 - **Color**(颜色):简化颜色混合以减少GPU负载。 6. 在 **LOD Transition**(LOD过渡)中,可以启用 **Interpolate**(插值)选项,使LOD切换更加平滑[^1]。 ### 优化粒子系统性能 - 使用LOD可以显著减少GPU和CPU的负载,特别是在处理大量粒子时。例如,在较远距离上,可以禁用某些复杂的发射器或减少粒子数量。 - 可以结合 **Distance Culling**(距离剔除)功能,进一步优化性能。在 **Particle System Settings**(粒子系统设置)中,可以设置 **Max Draw Distance**(最大绘制距离)和 **Min Desired Size**(最小期望大小)。 ### 示例代码 以下是一个简单的蓝图设置LOD的示例: ```cpp // 在蓝图中设置粒子系统的LOD UParticleSystem* ParticleSystem = LoadObject<UParticleSystem>(nullptr, TEXT("/Game/Particles/MyParticleSystem.MyParticleSystem")); if (ParticleSystem) { ParticleSystem->LODSettings.LODLevels[0].ScreenSize = 1.0f; // 高细节 ParticleSystem->LODSettings.LODLevels[1].ScreenSize = 0.5f; // 中等细节 ParticleSystem->LODSettings.LODLevels[2].ScreenSize = 0.2f; // 低细节 } ``` ### 注意事项 - 在调整LOD设置时,建议在不同视角和距离下进行测试,确保视觉效果与性能之间的平衡。 - 如果粒子系统包含多个发射器,每个发射器都可以单独配置LOD行为,以实现更精细的优化。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值