欢迎大家加入Unreal Engine C++ & Blueprint群一起交流:1143575617
这一节我们将技能范围内检测到的敌人数据进行打包发送出去。
这里的发送是需要用到代理的:FGameplayAbilityTargetDataHandle类。
需要用到的父类属性有两个,一个是StartLocation,即技能起始位置。还有一个是TargetDataReadyDelegate,它是FAbilityTargetData的对象,包含有Broadcast方法,这是我们需要用到的。
在ComfirmTargetingAndContinue方法中加上以下代码(有重复的忽略):
void AGATargetActor::ConfirmTargetingAndContinue(){
FVector lookAt;
bool tryTrace = GetLookAtLocation(lookAt);
FCollisionQueryParams collisionQueryParams;
AShibiCharacter* shinbi = Cast<AShibiCharacter>(GetWorld()->GetFirstPlayerController()->GetPawn());
collisionQueryParams.bTraceComplex = false;
collisionQueryParams.bReturnPhysicalMaterial = false;
if (MasterPC) {
collisionQueryParams.AddIgnoredActor(shinbi->GetUniqueID());
}
TArray<FOverlapResult> overlaps;
TArray<TWeakObjectPtr<AActor>> overlapedActors;
bool rangeDetect = GetWorld()->OverlapMultiByObjectType(overlaps,lookAt,FQuat::Identity, FCollisionObjectQueryParams(ECC_Pawn),FCollisionShape::MakeSphere(Radius), collisionQueryParams);
if (rangeDetect) {
for (int i = 0; i < overlaps.Num();i++) {
APawn* pawnEnemy = Cast<APawn>(overlaps[i].GetActor());
if (pawnEnemy && !overlapedActors.Contains(pawnEnemy)) {
overlapedActors.Add(pawnEnemy);
}
}
}
if (overlapedActors.Num() > 0) {
FGameplayAbilityTargetDataHandle TargetDataHandle = StartLocation.MakeTargetDataHandleFromActors(overlapedActors);
TargetDataReadyDelegate.Broadcast(TargetDataHandle);
}
else {
TargetDataReadyDelegate.Broadcast(FGameplayAbilityTargetDataHandle());
}
}
最重要的就是最后一组if...else....,我们将数组里的敌人对象全部送到StartLocation中,通过代理来将这些数据广播出去。
接下来我们需要画一些DebugSphere,来看清楚我们的技能释放的位置。
重写父类的 virtual void Tick(float DeltaSeconds) override;方法。
virtual void Tick(float DeltaSeconds) override;
void AGATargetActor::Tick(float DeltaSeconds)
{
Super::Tick(DeltaSeconds);
FVector lookAt;
GetLookAtLocation(lookAt);
DrawDebugSphere(GetWorld(), lookAt, Radius, 1, FColor::Red, true, 5, 0, 2.0f);
}
编译程序,创建蓝图。
进入主角蓝图,创建激活GroundBlast技能。
打开GroundBlast技能蓝图,将Comfirmination 改为 用户确认,这里很好理解,你不会对着没有敌人的地方放技能。
未完。
本节无图例。