用蓝图实现
这个成品删掉,不要打开
创建一个actor蓝图类,重命名为Test_Barrel
打开蓝图,先给他添加一个mesh组件,我们这次直接将mesh文件拖入蓝图
材质也拖入蓝图
将mesh设为模拟物理
添加一个生命值组件
编写蓝图事件(vel change为true,代表速度是变化的)
添加一个辐射力度组件
并将其这个参数设为false
设置其他参数
继续添加节点
添加变换材质节点
编译测试成功
=====================================
用c++实现
创建一个actor类
声明成员变量成员函数
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components")
class UStaticMeshComponent * MeshComponent;
//生命值组件
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components")
class USHealthComponent * HealthComp;
//辐射力组件
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components")
class URadialForceComponent * RadialForceComp;
//当前材质
UPROPERTY(EditDefaultsOnly, Category = "FX")
class UMaterialInterface * CurrentMaterial;
//爆炸特效
UPROPERTY(EditDefaultsOnly, Category = "FX")
class UParticleSystem * ExplorEffect;
//向上的推力
UPROPERTY(EditDefaultsOnly, Category = "FX")
float ExplosionImpulse;
//桶爆炸函数
UFUNCTION()
void OnHealthChanged(USHealthComponent* OwnerHealthComp, float Health, float HealthDelta, const class UDamageType* DamageType, class AController* InstigatedBy, AActor* DamageCauser);
在构造函数中初始化成员变量和其他初始化操作
ASExplosiveBarrel::ASExplosiveBarrel()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
MeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MeshComponent"));
//设为模拟物理
MeshComponent->SetSimulatePhysics(true);
RootComponent = MeshComponent;
HealthComp = CreateDefaultSubobject<USHealthComponent>(TEXT("HealthComp"));
//绑定函数与事件
HealthComp->OnHealthChanged.AddDynamic(this, &ASExplosiveBarrel::OnHealthChanged);
RadialForceComp = CreateDefaultSubobject<URadialForceComponent>(TEXT("RadialForceComp"));
RadialForceComp->bImpulseVelChange = true;
RadialForceComp->bIgnoreOwningActor = true;
RadialForceComp->bAutoActivate = false;
RadialForceComp->SetupAttachment(RootComponent);
ExplosionImpulse = 400;
}
定义函数
void ASExplosiveBarrel::OnHealthChanged(USHealthComponent * OwnerHealthComp, float Health, float HealthDelta, const UDamageType * DamageType, AController * InstigatedBy, AActor * DamageCauser)
{
if (Health <= 0)
{
//发生爆炸
UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), ExplorEffect, GetActorLocation());
//给mesh组件添加一个向上的力
MeshComponent->AddImpulse(ExplosionImpulse * FVector::UpVector, NAME_None, true);
//设置材质
MeshComponent->SetMaterial(0, CurrentMaterial);
//范围力起作用
RadialForceComp->FireImpulse();
}
}
编译,创建其蓝图
设置相应的参数
编译,测试成功