위와 같이 ECC_GameTraceChannel1 에 Item할당되게 되면 기존의 BTService_SearchTarget에서 Player를 찾기위해 OverlapMultiByChannel을 사용할때 기본 설정으로 사용했던 ECC_GameTraceChannel1가 새로 추가한 Item 오브젝트의 설정을 따라가게되고 기본 반응이 무시로 덮어쓰이게됨.
따라서 이를 해결하기 위해서는 새로운 Object Channel을 설정하고 그 채널을 사용하거나 아무것도 할당되지 않은 ECC_GameTraceChannel2 채널을 사용하도록 수정할 필요가있어 ECC_GameTraceChannel2 채널을 사용하도록 수정하였음
//수정 전
void UBTService_SearchTarget::TickNode(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, float DeltaSeconds)
{
Super::TickNode(OwnerComp, NodeMemory, DeltaSeconds);
auto Pawn = OwnerComp.GetAIOwner()->GetPawn();
if (Pawn != nullptr)
{
FVector Center = Pawn->GetActorLocation();
float SearchDistance = 500.f;
TArray<FOverlapResult> OverlapResults;
FCollisionQueryParams QueryParams(NAME_Name, false, Pawn);
bool Result = GetWorld()->OverlapMultiByChannel
(
OverlapResults,
Center,
FQuat::Identity,
ECollisionChannel::ECC_GameTraceChannel1, // Item Object Channel이 할당되어 수정이 필요해진 부분
FCollisionShape::MakeSphere(SearchDistance),
QueryParams
);
if (Result)
{
for (auto& OverlapResult : OverlapResults)
{
auto Player = Cast<AMyPlayer>(OverlapResult.GetActor());
if (Player)
{
DrawDebugSphere(GetWorld(), Center, SearchDistance, 10, FColor::Green, false, 0.5f);
OwnerComp.GetBlackboardComponent()->SetValueAsObject(FName("Target"), Player);
return;
}
}
}
OwnerComp.GetBlackboardComponent()->SetValueAsObject(FName("Target"), nullptr);
DrawDebugSphere(GetWorld(), Center, SearchDistance, 10, FColor::Red, false, 0.5f);
}
}
//수정 후
void UBTService_SearchTarget::TickNode(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, float DeltaSeconds)
{
Super::TickNode(OwnerComp, NodeMemory, DeltaSeconds);
auto Pawn = OwnerComp.GetAIOwner()->GetPawn();
if (Pawn != nullptr)
{
FVector Center = Pawn->GetActorLocation();
float SearchDistance = 500.f;
TArray<FOverlapResult> OverlapResults;
FCollisionQueryParams QueryParams(NAME_Name, false, Pawn);
bool Result = GetWorld()->OverlapMultiByChanne2 // 수정 된 부분
(
OverlapResults,
Center,
FQuat::Identity,
ECollisionChannel::ECC_GameTraceChannel1,
FCollisionShape::MakeSphere(SearchDistance),
QueryParams
);
if (Result)
{
for (auto& OverlapResult : OverlapResults)
{
auto Player = Cast<AMyPlayer>(OverlapResult.GetActor());
if (Player)
{
DrawDebugSphere(GetWorld(), Center, SearchDistance, 10, FColor::Green, false, 0.5f);
OwnerComp.GetBlackboardComponent()->SetValueAsObject(FName("Target"), Player);
return;
}
}
}
OwnerComp.GetBlackboardComponent()->SetValueAsObject(FName("Target"), nullptr);
DrawDebugSphere(GetWorld(), Center, SearchDistance, 10, FColor::Red, false, 0.5f);
}
}