六一的部落格


关关难过关关过,前路漫漫亦灿灿。




说明

创建一个发射器NE_LauncherFlash, 两个粒子系统NS_LauncherMuzzle和NS_RiffleMuzzle

发射器的枪口特效较简单. 步枪的射击涉及定时器, 只创建一次粒子系统, 开始射击时, 令其开始并将其渲染, 停止射击时令其暂停, 不再对其进行渲染


创建Niagara粒子发射器

创建文件夹 Content/VFX/Muzzles

  • 创建Niagara粒子发射器


  • 使用模板


  • 选择 Simple Sprite Burst , 命名为NE_LauncherFlash


  • 设置纹理


  • 使用默认发射器状态: 不循环; 设置时长


  • 设置粒子数


  • 设置外观

    生存时间, 颜色, 聚集方式, 分布, 旋转模式


  • 添加属性: Scale Sprite Size


    起点


    终点


  • 添加属性: Sprite Rotation Rate


    设置Rotation Rate为 Particles > Initial > MaterialRandom



基于NE_LauncherFlash创建发射器使用的Niagara粒子系统资产

右键NE_LauncherFlash, 命名为NS_LauncherMuzzle


设置不变, 只播放一次



基于NE_LauncherFlash创建步枪使用的Niagara粒子系统资产

命名为NS_RifleMuzzle

循环播放, 设置时长


添加属性: Spawn Rate


设置为90


设置颜色



优化榴弹冲击特效

NS_ProjectileImpact

设置粒子数


设置分布



枪口特效


武器基类: 在枪口生成特效, 返回Niagara组件


添加属性: 保存特效类型

ShootThemUp: Weapon/STUBaseWeapon.h

protected

1class UNiagaraSystem;
2
3UPROPERTY(EDitDefaultsOnly, BlueprintReadWrite)
4UNiagaraSystem *MuzzleFX;

添加接口: 在枪口生成特效, 播放完自动销毁, 返回Niagara组件

ShootThemUp: Weapon/STUBaseWeapon.h

protected

1class UNiagaraComponent;
2
3UNiagaraComponent *SpawnMuzzleFX();

ShootThemUp: Weapon/STUBaseWeapon.cpp

 1#include "NiagaraFunctionLibrary.h"
 2#include "NiagaraComponent.h"
 3
 4UNiagaraComponent *ASTUBaseWeapon::SpawnMuzzleFX()
 5{
 6    return UNiagaraFunctionLibrary::SpawnSystemAttached(MuzzleFX, //
 7                                                        WeaponMeshComponent, //
 8                                                        MuzzleSocketName, //
 9                                                        FVector::ZeroVector, //
10                                                        FRotator::ZeroRotator, //
11                                                        EAttachLocation::SnapToTarget,//
12                                                        true);
13}
  • UNiagaraFunctionLibrary::SpawnSystemAttached

    Niagaram粒子系统的变换与上级组件变换保持一致

     1static UNiagaraComponent* SpawnSystemAttached(UNiagaraSystem* SystemTemplate,
     2                                              USceneComponent* AttachToComponent,
     3                                              FName AttachPointName,
     4                                              FVector Location,
     5                                              FRotator Rotation,
     6                                              EAttachLocation::Type LocationType,
     7                                              bool bAutoDestroy,
     8                                              bool bAutoActivate = true,
     9                                              ENCPoolMethod PoolingMethod = ENCPoolMethod::None,
    10                                              bool bPreCullCheck = true);
    -
    SystemTemplate 粒子特效类型
    AttachToComponent 上级组件
    AttachPointName 挂载点
    Location 位置
    Rotation 方向向量
    LocationType 挂载方式
    bAutoDestroy 特效若没有循环, 结束后销毁

榴弹发射器

射击后生成枪口特效

ShootThemUp: Weapon/STULauncherWeapon.cpp

1// MakeShot
2SpawnMuzzleFX();

步枪


添加属性: 保存Niagara组件

ShootThemUp: Weapon/STURifleWeapon.h

private

1class UNiagaraComponent;
2
3UPROPERTY()
4UNiagaraComponent *MuzzleFXComponent;

添加接口: 根据标志位设置特效

ShootThemUp: Weapon/STURifleWeapon.h

private

1void SetMuzzleFXVisibility(bool Visible);

ShootThemUp: Weapon/STURifleWeapon.cpp

1#include "NiagaraComponent.h"
2void ASTURifleWeapon::SetMuzzleFXVisibility(bool Visible)
3{
4    if (MuzzleFXComponent)
5    {
6        MuzzleFXComponent->SetPaused(!Visible);
7        MuzzleFXComponent->SetVisibility(Visible, true);
8    }
9}
  • SetPaused

    设置粒子系统暂停或继续, 即, 与Tick函数有关

  • SetVisibility

    设置是否渲染粒子系统

    第二个参数影响子节点的渲染, 此处设为true或false无影响


添加接口: 在枪口生成特效, 设置特效可见

ShootThemUp: Weapon/STURifleWeapon.h

private

1void InitMuzzleFX();

ShootThemUp: Weapon/STURifleWeapon.cpp

1void ASTURifleWeapon::InitMuzzleFX()
2{
3    if (!MuzzleFXComponent)
4    {
5        MuzzleFXComponent = SpawnMuzzleFX();
6    }
7    SetMuzzleFXVisibility(true);
8}

射击时生成特效或设置特效可见

1// FireStart
2InitMuzzleFX();

停止射击时设置特效不可见

1// FireStop
2SetMuzzleFXVisibility(false);

查看

设置步枪枪口动画


设置发射器枪口动画


步枪射击时移动, 有神龙甩尾的效果…


枪口特效



说明

创建一个发射器NE_LauncherFlash, 两个粒子系统NS_LauncherMuzzle和NS_RiffleMuzzle

发射器的枪口特效较简单. 步枪的射击涉及定时器, 只创建一次粒子系统, 开始射击时, 令其开始并将其渲染, 停止射击时令其暂停, 不再对其进行渲染


创建Niagara粒子发射器

创建文件夹 Content/VFX/Muzzles

  • 创建Niagara粒子发射器


  • 使用模板


  • 选择 Simple Sprite Burst , 命名为NE_LauncherFlash


  • 设置纹理


  • 使用默认发射器状态: 不循环; 设置时长


  • 设置粒子数


  • 设置外观

    生存时间, 颜色, 聚集方式, 分布, 旋转模式


  • 添加属性: Scale Sprite Size


    起点


    终点


  • 添加属性: Sprite Rotation Rate


    设置Rotation Rate为 Particles > Initial > MaterialRandom



基于NE_LauncherFlash创建发射器使用的Niagara粒子系统资产

右键NE_LauncherFlash, 命名为NS_LauncherMuzzle


设置不变, 只播放一次



基于NE_LauncherFlash创建步枪使用的Niagara粒子系统资产

命名为NS_RifleMuzzle

循环播放, 设置时长


添加属性: Spawn Rate


设置为90


设置颜色



优化榴弹冲击特效

NS_ProjectileImpact

设置粒子数


设置分布



枪口特效


武器基类: 在枪口生成特效, 返回Niagara组件


添加属性: 保存特效类型

ShootThemUp: Weapon/STUBaseWeapon.h

protected

1class UNiagaraSystem;
2
3UPROPERTY(EDitDefaultsOnly, BlueprintReadWrite)
4UNiagaraSystem *MuzzleFX;

添加接口: 在枪口生成特效, 播放完自动销毁, 返回Niagara组件

ShootThemUp: Weapon/STUBaseWeapon.h

protected

1class UNiagaraComponent;
2
3UNiagaraComponent *SpawnMuzzleFX();

ShootThemUp: Weapon/STUBaseWeapon.cpp

 1#include "NiagaraFunctionLibrary.h"
 2#include "NiagaraComponent.h"
 3
 4UNiagaraComponent *ASTUBaseWeapon::SpawnMuzzleFX()
 5{
 6    return UNiagaraFunctionLibrary::SpawnSystemAttached(MuzzleFX, //
 7                                                        WeaponMeshComponent, //
 8                                                        MuzzleSocketName, //
 9                                                        FVector::ZeroVector, //
10                                                        FRotator::ZeroRotator, //
11                                                        EAttachLocation::SnapToTarget,//
12                                                        true);
13}
  • UNiagaraFunctionLibrary::SpawnSystemAttached

    Niagaram粒子系统的变换与上级组件变换保持一致

     1static UNiagaraComponent* SpawnSystemAttached(UNiagaraSystem* SystemTemplate,
     2                                              USceneComponent* AttachToComponent,
     3                                              FName AttachPointName,
     4                                              FVector Location,
     5                                              FRotator Rotation,
     6                                              EAttachLocation::Type LocationType,
     7                                              bool bAutoDestroy,
     8                                              bool bAutoActivate = true,
     9                                              ENCPoolMethod PoolingMethod = ENCPoolMethod::None,
    10                                              bool bPreCullCheck = true);
    -
    SystemTemplate 粒子特效类型
    AttachToComponent 上级组件
    AttachPointName 挂载点
    Location 位置
    Rotation 方向向量
    LocationType 挂载方式
    bAutoDestroy 特效若没有循环, 结束后销毁

榴弹发射器

射击后生成枪口特效

ShootThemUp: Weapon/STULauncherWeapon.cpp

1// MakeShot
2SpawnMuzzleFX();

步枪


添加属性: 保存Niagara组件

ShootThemUp: Weapon/STURifleWeapon.h

private

1class UNiagaraComponent;
2
3UPROPERTY()
4UNiagaraComponent *MuzzleFXComponent;

添加接口: 根据标志位设置特效

ShootThemUp: Weapon/STURifleWeapon.h

private

1void SetMuzzleFXVisibility(bool Visible);

ShootThemUp: Weapon/STURifleWeapon.cpp

1#include "NiagaraComponent.h"
2void ASTURifleWeapon::SetMuzzleFXVisibility(bool Visible)
3{
4    if (MuzzleFXComponent)
5    {
6        MuzzleFXComponent->SetPaused(!Visible);
7        MuzzleFXComponent->SetVisibility(Visible, true);
8    }
9}
  • SetPaused

    设置粒子系统暂停或继续, 即, 与Tick函数有关

  • SetVisibility

    设置是否渲染粒子系统

    第二个参数影响子节点的渲染, 此处设为true或false无影响


添加接口: 在枪口生成特效, 设置特效可见

ShootThemUp: Weapon/STURifleWeapon.h

private

1void InitMuzzleFX();

ShootThemUp: Weapon/STURifleWeapon.cpp

1void ASTURifleWeapon::InitMuzzleFX()
2{
3    if (!MuzzleFXComponent)
4    {
5        MuzzleFXComponent = SpawnMuzzleFX();
6    }
7    SetMuzzleFXVisibility(true);
8}

射击时生成特效或设置特效可见

1// FireStart
2InitMuzzleFX();

停止射击时设置特效不可见

1// FireStop
2SetMuzzleFXVisibility(false);

查看

设置步枪枪口动画


设置发射器枪口动画


步枪射击时移动, 有神龙甩尾的效果…