使用贴花实现弹痕
2023年10月15日 2024年1月11日
说明
使用贴花实现弹痕
从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的输入