六一的部落格


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




说明

使用贴花实现弹痕


从ShooterGame获取贴花资产

Content/Effects/materials/Weapon/M_Impact_Decal , 右键


文件夹结构



导入ShootThemUp

将Effect重命名为BulletDecal, 移动到 ExternalContent , 设置文件夹颜色


用来实现弹痕


重新构造光照

有对应提示时

  • 设置光照质量

    Build > Lighting Quality


  • 构造光照



贴花

可以投影到网格体的特殊材质. 支持静态网格体和骨骼网格体

可以设置贴花的体积大小, 纹理, 隐入隐出相关参数


贴花Actor对应一个立方体, 立方体与包含物体的相交面作为投影面

我们可以使用贴花在墙上画涂鸦, 在不同表面上生成不同子弹特效


测试贴花Actor


创建测试纹理

  • 创建文件夹 Content/Dev

  • 从网络下载虚幻引擎Logo作为纹理, 保存到Content/Dev


  • 右键图片, 创建纹理, 命名为M_TestDecal


  • 和之前的材质比较, 图片作为BaseColor的输入


  • 将材质作为贴花使用的设置

    延后贴花; 半透明渲染: Details > Material > Material Domain , 设置为 Deferred Decal ; Blend Mode 设置为 Translucent


    Alpha通道作为透明度的输入



设置贴花

  • 添加贴花Actor到关卡中

    Place Actors > Visual Effects > Decal Actor

  • 使用M_TestDecal

    选中贴花, 点击应用图标



  • 设置贴花体积

    选中DecalActor, Details > Decal > Decal Size , 设置X = 10, Y = Z = 20


查看弹痕贴花

Content/ExternalContent/BulletDecal/Materials/Weapon/M_Impact_Decal

双击打开, 较M_TestDecal更为复杂, 添加了法向量和饱和度设置, 用以提高视觉质量



击中时生成贴花

产生冲击特效时生成贴花


添加数据结构

ShootThemUp: STUCoreTypes.h


贴花信息

  • 贴花材质
  • 立方体体积参数
  • 留存时间
  • 贴花Alpha分量的动画时长

    在给定时长, 贴花从场景中消失
 1// VFX
 2class UMaterialInterface;
 3USTRUCT(BlueprintType)
 4struct FDecalData
 5{
 6    GENERATED_USTRUCT_BODY()
 7
 8    UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
 9    UMaterialInterface *Material;
10
11    UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
12    FVector Size = FVector(10.0f);
13
14    UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
15    float LifeTime = 5.0f;
16
17    UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
18    float FadeOutTime = 0.7f;
19};

特效信息整合: 包含Niagara粒子系统和贴花

 1class NiagaraSystem;
 2
 3USTRUCT(BlueprintType)
 4struct FImpactData
 5{
 6    GENERATED_USTRUCT_BODY()
 7
 8    UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
 9    UNiagaraSystem *NiagaraEffect;
10
11    UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
12    FDecalData DecalData;
13};

使用特效数据结构

ShootThemUp: Weapon/Components/STUWeaponFXComponent.h

protected

1#include "STUCoreTypes.h"
2
3UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
4FImpactData DefaultImpactData;
5
6UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
7TMap<UPhysicalMaterial*, FImpactData> ImpactDataMap;

ShootThemUp: Weapon/Components/STUWeaponFXComponent.cpp

 1auto ImpactData = DefaultImpactData;
 2
 3if (ImpactDataMap.Contains(PhysMat))
 4{
 5    ImpactData = ImpactDataMap[PhysMat];
 6}
 7
 8// Niagara
 9UNiagaraFunctionLibrary::SpawnSystemAtLocation(GetWorld(), //
10                                               ImpactData.NiagaraEffect, //
11                                               Hit.ImpactPoint, //
12                                               Hit.ImpactNormal.Rotation());

生成贴花

2个函数可以生成贴花

  • SpawnDecalAtLocation : 在给定世界座标生成贴花

    -
    WorldContextObject 世界上下文
    DecalMaterial 贴花材质
    DecalSize 贴花体积参数
    Location 位置
    Rotation 方向向量
    1static UDecalComponent* SpawnDecalAtLocation(const UObject* WorldContextObject, class UMaterialInterface* DecalMaterial, FVector DecalSize, FVector Location, FRotator Rotation = FRotator(-90, 0, 0), float LifeSpan = 0);
  • SpawnDecalAttached : 生成贴花后设置上级组件

设置隐入隐出

  • SetFadeIn : 贴花出现
  • SetFadeOut

    StartDelay参数: 贴花出现后多久开始播放消失动画

    DestroyOwnerAfterFade参数: 使用SpawnDecalAttached生成贴花时, 该参数有效; 从上级组件移除贴花; 默认值为true
    1void UDecalComponent::SetFadeOut(float StartDelay, float Duration, bool DestroyOwnerAfterFade); // DestroyOwnerAfterFade = true
    

ShootThemUp: Weapon/Components/STUWeaponFXComponent.cpp

 1#include "Kismet/GameplayStatics.h"
 2#include "Components/DecalComponent.h"
 3
 4// PlayImpactFX
 5
 6// decal
 7auto DecalComponent = UGameplayStatics::SpawnDecalAtLocation(GetWorld(), //
 8                                                             ImpactData.DecalData.Material, //
 9                                                             ImpactData.DecalData.Size, //
10                                                             Hit.ImpactPoint, //
11                                                             Hit.ImpactNormal.Rotation());
12if (DecalComponent)
13{
14    DecalComponent->SetFadeOut(ImpactData.DecalData.LifeTime, ImpactData.DecalData.FadeOutTime);
15}

设置特效数据属性


步枪

默认特效数据


映射: 拷贝DecalData属性



榴弹

设置贴花体积参数


图示错误

Size: X = 10, Y = Z = 100


效果




设置弹痕消失动画

M_Impact_Decal

为Alpha通道添加动画

使用 Utils > DecalLifetimeOpacity 节点, 该变量存储贴花透明变量, 开始播放贴花隐出动画时, 该变量由1变为0

节点输出和纹理的Alpha分量相乘, 作为Opacity的输入


使用贴花实现弹痕



说明

使用贴花实现弹痕


从ShooterGame获取贴花资产

Content/Effects/materials/Weapon/M_Impact_Decal , 右键


文件夹结构



导入ShootThemUp

将Effect重命名为BulletDecal, 移动到 ExternalContent , 设置文件夹颜色


用来实现弹痕


重新构造光照

有对应提示时

  • 设置光照质量

    Build > Lighting Quality


  • 构造光照



贴花

可以投影到网格体的特殊材质. 支持静态网格体和骨骼网格体

可以设置贴花的体积大小, 纹理, 隐入隐出相关参数


贴花Actor对应一个立方体, 立方体与包含物体的相交面作为投影面

我们可以使用贴花在墙上画涂鸦, 在不同表面上生成不同子弹特效


测试贴花Actor


创建测试纹理

  • 创建文件夹 Content/Dev

  • 从网络下载虚幻引擎Logo作为纹理, 保存到Content/Dev


  • 右键图片, 创建纹理, 命名为M_TestDecal


  • 和之前的材质比较, 图片作为BaseColor的输入


  • 将材质作为贴花使用的设置

    延后贴花; 半透明渲染: Details > Material > Material Domain , 设置为 Deferred Decal ; Blend Mode 设置为 Translucent


    Alpha通道作为透明度的输入



设置贴花

  • 添加贴花Actor到关卡中

    Place Actors > Visual Effects > Decal Actor

  • 使用M_TestDecal

    选中贴花, 点击应用图标



  • 设置贴花体积

    选中DecalActor, Details > Decal > Decal Size , 设置X = 10, Y = Z = 20


查看弹痕贴花

Content/ExternalContent/BulletDecal/Materials/Weapon/M_Impact_Decal

双击打开, 较M_TestDecal更为复杂, 添加了法向量和饱和度设置, 用以提高视觉质量



击中时生成贴花

产生冲击特效时生成贴花


添加数据结构

ShootThemUp: STUCoreTypes.h


贴花信息

  • 贴花材质
  • 立方体体积参数
  • 留存时间
  • 贴花Alpha分量的动画时长

    在给定时长, 贴花从场景中消失
 1// VFX
 2class UMaterialInterface;
 3USTRUCT(BlueprintType)
 4struct FDecalData
 5{
 6    GENERATED_USTRUCT_BODY()
 7
 8    UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
 9    UMaterialInterface *Material;
10
11    UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
12    FVector Size = FVector(10.0f);
13
14    UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
15    float LifeTime = 5.0f;
16
17    UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
18    float FadeOutTime = 0.7f;
19};

特效信息整合: 包含Niagara粒子系统和贴花

 1class NiagaraSystem;
 2
 3USTRUCT(BlueprintType)
 4struct FImpactData
 5{
 6    GENERATED_USTRUCT_BODY()
 7
 8    UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
 9    UNiagaraSystem *NiagaraEffect;
10
11    UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
12    FDecalData DecalData;
13};

使用特效数据结构

ShootThemUp: Weapon/Components/STUWeaponFXComponent.h

protected

1#include "STUCoreTypes.h"
2
3UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
4FImpactData DefaultImpactData;
5
6UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
7TMap<UPhysicalMaterial*, FImpactData> ImpactDataMap;

ShootThemUp: Weapon/Components/STUWeaponFXComponent.cpp

 1auto ImpactData = DefaultImpactData;
 2
 3if (ImpactDataMap.Contains(PhysMat))
 4{
 5    ImpactData = ImpactDataMap[PhysMat];
 6}
 7
 8// Niagara
 9UNiagaraFunctionLibrary::SpawnSystemAtLocation(GetWorld(), //
10                                               ImpactData.NiagaraEffect, //
11                                               Hit.ImpactPoint, //
12                                               Hit.ImpactNormal.Rotation());

生成贴花

2个函数可以生成贴花

  • SpawnDecalAtLocation : 在给定世界座标生成贴花

    -
    WorldContextObject 世界上下文
    DecalMaterial 贴花材质
    DecalSize 贴花体积参数
    Location 位置
    Rotation 方向向量
    1static UDecalComponent* SpawnDecalAtLocation(const UObject* WorldContextObject, class UMaterialInterface* DecalMaterial, FVector DecalSize, FVector Location, FRotator Rotation = FRotator(-90, 0, 0), float LifeSpan = 0);
  • SpawnDecalAttached : 生成贴花后设置上级组件

设置隐入隐出

  • SetFadeIn : 贴花出现
  • SetFadeOut

    StartDelay参数: 贴花出现后多久开始播放消失动画

    DestroyOwnerAfterFade参数: 使用SpawnDecalAttached生成贴花时, 该参数有效; 从上级组件移除贴花; 默认值为true
    1void UDecalComponent::SetFadeOut(float StartDelay, float Duration, bool DestroyOwnerAfterFade); // DestroyOwnerAfterFade = true
    

ShootThemUp: Weapon/Components/STUWeaponFXComponent.cpp

 1#include "Kismet/GameplayStatics.h"
 2#include "Components/DecalComponent.h"
 3
 4// PlayImpactFX
 5
 6// decal
 7auto DecalComponent = UGameplayStatics::SpawnDecalAtLocation(GetWorld(), //
 8                                                             ImpactData.DecalData.Material, //
 9                                                             ImpactData.DecalData.Size, //
10                                                             Hit.ImpactPoint, //
11                                                             Hit.ImpactNormal.Rotation());
12if (DecalComponent)
13{
14    DecalComponent->SetFadeOut(ImpactData.DecalData.LifeTime, ImpactData.DecalData.FadeOutTime);
15}

设置特效数据属性


步枪

默认特效数据


映射: 拷贝DecalData属性



榴弹

设置贴花体积参数


图示错误

Size: X = 10, Y = Z = 100


效果




设置弹痕消失动画

M_Impact_Decal

为Alpha通道添加动画

使用 Utils > DecalLifetimeOpacity 节点, 该变量存储贴花透明变量, 开始播放贴花隐出动画时, 该变量由1变为0

节点输出和纹理的Alpha分量相乘, 作为Opacity的输入