斯坦福UE4 C++课学习补充 16:材质-闪烁溶解效果

一、创建材质

  1. 此节将实现一个物体受击后闪烁特效
  2. 新建一个材质,设置“自发光颜色”属性,来实现材质瞬间的闪烁。在材质中拥有一个时间,当物体被Hit时,通过C++把TimeToHit设置为当前时间,在这个瞬间两者相减的结果为0;但Hit触发时需要物体发光,“自发光颜色”属性需要设置大于0,于是接通过1-x节点把0变为1。最后,由于材质内的Time节点会持续更新,导致减法的差值越来越大,使用Clamp限制其上下界为1和0。

Clamp函数:把输入的值或纹理限制在自己设置的最大值MAX和最小值MIN区间之间(即超过最大值则返回最大值,超过最小值则返回最小值)

在这里插入图片描述

二、代码传值

  1. 在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);
	}
} 
  1. 回到UE,新建TargetDummyBP蓝图类,继承上面的TargetDummy类。为其设置任意一个几何体,并设置上面完成的的闪烁材质
  2. 一个小技巧:此时的闪烁速度还是比较慢的,如果希望加快闪烁的速度,只需要增加“自发光颜色”值的变化速度,所以在减法后加入乘法
    在这里插入图片描述
  3. 进一步,我们可以将乘法的乘数作为一个参数暴露出来,将其创建为HitFlashSpeed参数,并设置默认值不为0。这样做之后,我们可以像上一节一样创建材质实例,方便实时调整动画速度;更进一步,我们还可以在代码中实现根据伤害量决定闪烁的速度的功能 ,或者其它效果。

三、溶解效果

  1. 我们此时想创建一个具有溶解效果的材质。新建材质后,在细节面板中将该材质的“混合模式”设置为“遮罩”,为了材质透明后可以渲染另一边的内容,可以勾选“双面”。
  2. 创建一个Texture Sample,设置为任意一个名字带有“cloud”或“noise”的纹理。随后,将其连入“不透明蒙版”引脚, 这样,就可以看到部分透明的效果

为了稍后可以正常显示动态的溶解效果,记得勾选“视口选项”下的“实时”。

  1. 调整材质的“不透明蒙版剪切值”,这个值越大,材质透明的部分越多。我们使用的纹理各个点的Alpha值不等(决定是否透明的通道),“不透明蒙版剪切值”就是决定显示与否的阈值,纹理的Alpha值超过这个阈值的部分就可以显示。因此,我们可以通过设置Alpha值来控制动态溶解效果
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值