一、创建材质
- 此节将实现一个物体受击后的闪烁特效。
- 新建一个材质,设置“自发光颜色”属性,来实现材质瞬间的闪烁。在材质中拥有一个时间,当物体被
Hit
时,通过C++把TimeToHit
设置为当前时间,在这个瞬间两者相减的结果为0
;但Hit
触发时需要物体发光,“自发光颜色”属性需要设置大于0
,于是接通过1-x
节点把0变为1。最后,由于材质内的Time
节点会持续更新,导致减法的差值越来越大,使用Clamp
限制其上下界为1和0。
Clamp
函数:把输入的值或纹理限制在自己设置的最大值MAX
和最小值MIN
区间之间(即超过最大值则返回最大值,超过最小值则返回最小值)
二、代码传值
- 在UE中从Actor派生一个
STargetDummy
类,用于编写相关代码。创建一个静态网格体组件和SAttributeComp
组件,并绑定其中自定义的OnHealthChanged
事件,以实现设置TimeToHit
变量为当前时间。
- STargetDummy.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "SurTargetDummy.generated.h"
class USurAttributeComponent;
UCLASS()
class SURKEAUE_API ASurTargetDummy : public AActor
{
GENERATED_BODY()
protected:
//是要用于人物受击动画的材质,需要角色的组件实例
UPROPERTY(VisibleAnywhere)
USurAttributeComponent* AttributeComp;
UPROPERTY(VisibleAnywhere)
UStaticMeshComponent* MeshComp;
UFUNCTION()
void OnHealthChanged(AActor* InstigatorActor, USurAttributeComponent* OwningComp, float NewHealth, float Delta);
public:
ASurTargetDummy();
};
- STargetDummy.cpp
#include "SurTargetDummy.h"
#include "SurAttributeComponent.h"
ASurTargetDummy::ASurTargetDummy()
{
MeshComp = CreateDefaultSubobject<UStaticMeshComponent>("MeshComp");
RootComponent = MeshComp;
AttributeComp = CreateDefaultSubobject<USurAttributeComponent>("AttributeComp");
AttributeComp->OnHealthChanged.AddDynamic(this, &ASurTargetDummy::OnHealthChanged);
}
void ASurTargetDummy::OnHealthChanged(AActor* InstigatorActor, USurAttributeComponent* OwningComp, float NewHealth, float Delta)
{
// 治愈(>0)或免疫(=0)时不触发受击特效
if (Delta < 0) {
//设置参数的关键语句
MeshComp->SetScalarParameterValueOnMaterials("TimeToHit", GetWorld()->TimeSeconds);
}
}
- 回到UE,新建
TargetDummyBP
蓝图类,继承上面的TargetDummy
类。为其设置任意一个几何体,并设置上面完成的的闪烁材质 - 一个小技巧:此时的闪烁速度还是比较慢的,如果希望加快闪烁的速度,只需要增加“自发光颜色”值的变化速度,所以在减法后加入乘法
- 进一步,我们可以将乘法的乘数作为一个参数暴露出来,将其创建为
HitFlashSpeed
参数,并设置默认值不为0
。这样做之后,我们可以像上一节一样创建材质实例,方便实时调整动画速度;更进一步,我们还可以在代码中实现根据伤害量决定闪烁的速度的功能 ,或者其它效果。
三、溶解效果
- 我们此时想创建一个具有溶解效果的材质。新建材质后,在细节面板中将该材质的“混合模式”设置为“遮罩”,为了材质透明后可以渲染另一边的内容,可以勾选“双面”。
- 创建一个
Texture Sample
,设置为任意一个名字带有“cloud
”或“noise
”的纹理。随后,将其连入“不透明蒙版”引脚, 这样,就可以看到部分透明的效果
为了稍后可以正常显示动态的溶解效果,记得勾选“视口选项”下的“实时”。
- 调整材质的“不透明蒙版剪切值”,这个值越大,材质透明的部分越多。我们使用的纹理各个点的
Alpha
值不等(决定是否透明的通道),“不透明蒙版剪切值”就是决定显示与否的阈值,纹理的Alpha
值超过这个阈值的部分就可以显示。因此,我们可以通过设置Alpha值来控制动态的溶解效果