16uec++多人游戏【爆炸汽油桶】

用蓝图实现

这个成品删掉,不要打开

创建一个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();
	}

}

 编译,创建其蓝图

设置相应的参数

 

 编译,测试成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhang2362167998

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值