20uec++多人游戏【小球与玩家互动】
创始人
2024-03-04 12:52:21
0

为小球添加生命值组件和伤害处理函数

//生命值组件UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components")class USHealthComponent * HealthComp;//伤害处理函数UFUNCTION()void HandleTakeAnyDamage(USHealthComponent * OwnerHealthComp, float Health, float HealthDelta, const UDamageType * DamageType, AController * InstigatedBy, AActor * DamageCauser);

创建组件并定义函数

HealthComp = CreateDefaultSubobject(TEXT("HealthComp"));
void AASTrackerBot::HandleTakeAnyDamage(USHealthComponent * OwnerHealthComp, float Health, float HealthDelta, const UDamageType * DamageType, AController * InstigatedBy, AActor * DamageCauser)
{UKismetSystemLibrary::PrintString(this, FString::SanitizeFloat(HealthComp->Health));}

添加与爆炸相关的成员变量和函数

	//自爆函数void SelfDestruct();//爆炸特效UPROPERTY(EditDefaultsOnly, Category = "TracerBot")class UParticleSystem * ExplorEffect;//是否已经爆炸bool bExplored;//爆炸半径UPROPERTY(EditDefaultsOnly, Category = "TracerBot")float ExplorRadius;//爆炸伤害UPROPERTY(EditDefaultsOnly, Category = "TracerBot")float ExplorDamage;

在构造函数中初始化一下

	bExplored = false;ExplorRadius = 200;ExplorDamage = 100;

定义自爆函数

void AASTrackerBot::SelfDestruct()
{//检查是否已经爆炸了if (bExplored){return;}bExplored = true;//发生爆炸UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), ExplorEffect, GetActorLocation());//设置要忽略的actorTArray IgnoredActors;IgnoredActors.Add(this);//对自身进行伤害UGameplayStatics::ApplyRadialDamage(this, ExplorDamage, GetActorLocation(), ExplorRadius, nullptr, IgnoredActors, this, GetInstigatorController(), true);//画出伤害范围DrawDebugSphere(GetWorld(), GetActorLocation(), ExplorRadius, 12, FColor::Green, false, 2.0f, 0, 1.0f);//自毁Destroy();
}

在伤害处理中,调用该函数

void AASTrackerBot::HandleTakeAnyDamage(USHealthComponent * OwnerHealthComp, float Health, float HealthDelta, const UDamageType * DamageType, AController * InstigatedBy, AActor * DamageCauser)
{UKismetSystemLibrary::PrintString(this, FString::SanitizeFloat(HealthComp->Health));if (HealthComp->Health <= 0){SelfDestruct();}
}

===========================================

现在实现靠近玩家定时自爆功能

创建相关的变量和函数

	//球形碰撞组件UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components")class USphereComponent* CollisionComponent;//自爆倒计时句柄FTimerHandle TimerHandle_SelfDamage;//倒计时自爆函数void DamageSelf();//是否已经开始自毁倒计时bool bStartSelfDamge;//游戏重叠函数virtual void NotifyActorBeginOverlap(AActor * OtherActor) override;

在构造函数中创建球形组件,并设置相关参数

	CollisionComponent = CreateDefaultSubobject(TEXT("SphereComponent"));CollisionComponent->SetSphereRadius(200);CollisionComponent->SetCollisionEnabled(ECollisionEnabled::QueryOnly);CollisionComponent->SetCollisionResponseToAllChannels(ECR_Ignore);CollisionComponent->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);CollisionComponent->SetupAttachment(RootComponent);

定义倒计时自爆函数

void AASTrackerBot::DamageSelf()
{UGameplayStatics::ApplyDamage(this, 20, GetInstigatorController(), this, nullptr);
}

定义重叠函数

void AASTrackerBot::NotifyActorBeginOverlap(AActor * OtherActor)
{if (!bStartSelfDamge){ASCharacter * PlayerPawn = Cast(OtherActor);if (PlayerPawn){GetWorld()->GetTimerManager().SetTimer(TimerHandle_SelfDamage, this, &AASTrackerBot::DamageSelf, 0.5f, true , 0.0f);bStartSelfDamge = true;}}
}

编译,然后打开小球的蓝图,选择特效

编译,测试,发现小球不会爆炸。

将构造函数的事件绑定函数放到游戏开始函数。就可以了

// Called when the game starts or when spawned
void AASTrackerBot::BeginPlay()
{Super::BeginPlay();NextPathPoint = GetNextPathPoint();//伤害事件绑定函数HealthComp->OnHealthChanged.AddDynamic(this, &AASTrackerBot::HandleTakeAnyDamage);
}

 我也不知道为啥。

同时也可以炸死人。

========================================

现在我们为小球完善一下材质

 按住T,点击鼠标左键

然后选择一个材质

 

按U,然后点击鼠标左键

 

将这两个设成4

 

这样可以让材质变得密集 

 

按住M,然后点击鼠标左键,得到乘节点,然后连线

 

按住1,然后点击鼠标左键,生成常数节点,然后连接到自发光上面

 这是将值设为0.5的效果

添加一个Time节点

 

 

然后按住s,点击鼠标左键,生成参数节点 

 我们用(时间-参数)*4,然后约束一下乘积。

 然后1-上述结果

然后再得到一个指数

然后将其赋予到自发光上面

 回到小球类,我们添加一个小球材质的变量

	//动态材质class UMaterialInstanceDynamic * MatInst;
#include "Materials/MaterialInstanceDynamic.h"

完善伤害处理函数

void AASTrackerBot::HandleTakeAnyDamage(USHealthComponent * OwnerHealthComp, float Health, float HealthDelta, const UDamageType * DamageType, AController * InstigatedBy, AActor * DamageCauser)
{//UKismetSystemLibrary::PrintString(this, FString::SanitizeFloat(HealthComp->Health));//得到MeshComponent组件的材质if (MatInst == nullptr){MatInst = MeshComponent->CreateAndSetMaterialInstanceDynamicFromMaterial(0, MeshComponent->GetMaterial(0));UKismetSystemLibrary::PrintString(this, FString::SanitizeFloat(HealthComp->Health));}//将参数设为当前时间,让材质发光if (MatInst){MatInst->SetScalarParameterValue("LastTimeDamageTaken", GetWorld()->TimeSeconds);}//自爆if (HealthComp->Health <= 0){SelfDestruct();}
}

==========================================

现在加一下声音特效

添加两个成员变量

	//自爆中声音特效UPROPERTY(EditDefaultsOnly, Category = "TracerBot")class USoundCue * SelfDestructSound;//爆炸特效UPROPERTY(EditDefaultsOnly, Category = "TracerBot")class USoundCue * ExploedSound;
#include "Sound/SoundCue.h"

更新一下SelfDestruct函数和NotifyActorBeginOverlap函数

void AASTrackerBot::SelfDestruct()
{//检查是否已经爆炸了if (bExplored){return;}bExplored = true;//发生爆炸UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), ExplorEffect, GetActorLocation());//设置要忽略的actorTArray IgnoredActors;IgnoredActors.Add(this);
//	UKismetSystemLibrary::PrintString(this, FString::SanitizeFloat(222.0f));//对自身进行伤害UGameplayStatics::ApplyRadialDamage(this, ExplorDamage, GetActorLocation(), ExplorRadius, nullptr, IgnoredActors, this, GetInstigatorController(), true);//画出伤害范围DrawDebugSphere(GetWorld(), GetActorLocation(), ExplorRadius, 12, FColor::Green, false, 2.0f, 0, 1.0f);//发生爆炸声,在actor的位置UGameplayStatics::PlaySoundAtLocation(this, ExploedSound, GetActorLocation());//自毁Destroy();
}
void AASTrackerBot::NotifyActorBeginOverlap(AActor * OtherActor)
{if (!bStartSelfDamge){ASCharacter * PlayerPawn = Cast(OtherActor);if (PlayerPawn){GetWorld()->GetTimerManager().SetTimer(TimerHandle_SelfDamage, this, &AASTrackerBot::DamageSelf, 0.5f, true , 0.0f);bStartSelfDamge = true;}//将自爆警告声音绑定到根组件UGameplayStatics::SpawnSoundAttached(SelfDestructSound, RootComponent);}
}

删掉这些成品,我们自己做一个

创建cue, cue实际上就是声音文件的子类

 

 

设置声音衰减

 

我们还可以做一个音效衰减

 

创建之后打开,设为自然音

这里选择衰减 

 

 

在蓝图中选择声音

 

然后添加一个声音组件,选择滚动声效

 

 

 编译测试成功  

相关内容

热门资讯

春天活动主持词 春天活动主持词  大家上午好!  踏着春天的脚步,踩着春风的节拍,春天已经来到我们中间,春天是生命的...
幼儿园家长会园长致辞 幼儿园家长会园长致辞幼儿园家长会园长致辞亲爱的家长、老师们:首先感谢大家在百忙中抽空参加今天举行的家...
教师节活动主持词 教师节活动主持词  一、什么是主持词  由主持人于节目进行过程中串联节目的串联词。如今的各种演出活动...
百日宴致辞 百日宴致辞范文  在日复一日的学习、工作或生活中,许多人都有过写致辞的经历,对致辞都不陌生吧,在各种...
2021年会总经理简短致辞 2021年会总经理简短致辞范文(通用6篇)  在学习、工作、生活中,许多人都有过写致辞的经历,对致辞...
中学秋季开学典礼主持词 中学秋季开学典礼主持词  中学秋季开学典礼主持词    第一项:升国旗仪式(升旗仪式结束后,请新教师...
婚礼男方家长经典致辞 婚礼男方家长经典致辞  大家好!今天是我儿子××和××小姐结婚的大喜日子,我感到非常高兴和荣幸。高兴...
元宵晚会主持词 关于元宵晚会主持词(通用11篇)  主持词是主持人在台上表演的灵魂之所在。在当今社会生活中,司仪等是...
国学经典诵读比赛主持词 国学经典诵读比赛主持词  主持词可以采用和历史文化有关的表述方法去写作以提升活动的文化内涵。随着社会...
离职感谢词 离职感谢词  在xx近两个月的生活,让我感触很多,首先感谢领导一直以来对我们的包容,感谢x经理的照顾...
年会总经理致辞 年会总经理致辞(精选7篇)  在学习、工作、生活中,大家都经常接触到致辞吧,致辞具有“礼仪性”或“仪...
八十大寿宴会主持词 八十大寿宴会主持词  借鉴诗词和散文诗是主持词的一种写作手法。在当下这个社会中,主持人的需求越来越高...
校园迎新春晚会主持词 校园迎新春晚会主持词  主持词已成为各种演出活动和集会中不可或缺的一部分。在当今不断发展的世界,越来...
同桌的你小品台词参考 同桌的你小品台词参考  王小利和小沈阳上场  王小利:儿子,今天,我带你去见一位特别重要的人物。  ...
文艺汇演主持人串词 文艺汇演主持人串词  开场:  萌:尊敬的各位领导,各位来宾。  泓:亲爱的老师们,同学们。大家  ...
年度总结表彰大会主持词 年度总结表彰大会主持词9篇  总结是指社会团体、企业单位和个人在自身的某一时期、某一项目或某些工作告...
小学庆六一儿童节主持词 小学庆六一儿童节主持词(精选5篇)  契合现场环境的主持词能给集会带来双倍的效果。随着社会一步步向前...
经销商大会主持稿 经销商大会主持稿推荐  经销商大会主持稿(一)  尊敬的各位来宾,各位朋友  大家上午好  (8:5...
年会精彩致辞 年会精彩致辞(通用7篇)  在学习、工作乃至生活中,大家对致辞都不陌生吧,致辞具有很强的实用性和针对...
少儿活动主持人主持词 少儿活动主持人主持词  主持词需要富有情感,充满热情,才能有效地吸引到观众。我们眼下的社会,主持人参...