프로젝트 세팅에서 Object Channel 추가로인한 오류 발생

  • 기존에 아무것도 생성하지않은 상태에서 Item Object Channel 추가로 인해 비헤비어트리 서비스 노드에 문제가 발생하여 Enemy가 Player를 타겟으로 서치하는 BTService_SearchTarget 클래스가 제대로 작동하지않음

  • 위와같이Object Channel을 추가하게 되면 DefaultEngine.ini파일에 아래와 같은 코드가 추가되어 ECC_GameTraceChannel1 에 Item이 할당되게 된다.
DefaultChannelResponses=(Channel=ECC_GameTraceChannel1,DefaultResponse=ECR_Ignore,bTraceType=False,bStaticObject=False,Name="Item")
  • 위와 같이 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);

    }


}

' > 공부' 카테고리의 다른 글

Claude 사용기  (3) 2025.08.22
AI와 기술 부채  (3) 2025.08.10

+ Recent posts