EnemyCharacter의 Detect 비헤이비어트리 서비스 입니다.
"이득우의 언리얼 C++ 게임 개발의 정석"을 참고하였습니다.
BTS_EDR_Detect.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "BehaviorTree/BTService.h"
#include "BTS_EDR_Detect.generated.h"
/**
*
*/
UCLASS()
class EDR_API UBTS_EDR_Detect : public UBTService
{
GENERATED_BODY()
public:
UBTS_EDR_Detect();
protected:
virtual void TickNode(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, float DeltaSeconds)override;
};
반응형
BTS_EDR_Detect.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "BTS_EDR_Detect.h"
#include "EDR/YS/EDRCharacter.h"
#include "MyCharacter.h"
#include "Enemy_EDR_AIController.h"
#include "BehaviorTree/BlackboardComponent.h"
#include "DrawDebugHelpers.h"
#include "Engine/OverlapResult.h"
#include "Engine/HitResult.h"
UBTS_EDR_Detect::UBTS_EDR_Detect()
{
NodeName = TEXT("Detect");
Interval = 1.0f;
}
void UBTS_EDR_Detect::TickNode(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, float DeltaSeconds)
{
Super::TickNode(OwnerComp, NodeMemory, DeltaSeconds);
APawn* ControllingPawn = OwnerComp.GetAIOwner()->GetPawn();
if (nullptr == ControllingPawn)
{
return;
}
UWorld* World = ControllingPawn->GetWorld();
FVector Center = ControllingPawn->GetActorLocation();
// 감지 범위
float DetectRadius = 2000.0f;
if (nullptr == World)
{
return;
}
TArray<FOverlapResult> OverlapResults;
FCollisionQueryParams CollisionQueryParam(NAME_None, false, ControllingPawn);
// 다른 액터와 오버랩 되는지 감지
bool bResult = World->OverlapMultiByChannel(
// 오버랩 결과 저장
OverlapResults,
Center,
FQuat::Identity,
ECollisionChannel::ECC_GameTraceChannel2,
FCollisionShape::MakeSphere(DetectRadius),
CollisionQueryParam
);
// 오버랩시, 참일경우
if (bResult)
{
for (auto const& OverlapResult : OverlapResults)
{
AEDRCharacter* EDRCharacter = Cast<AEDRCharacter>(OverlapResult.GetActor());
// 감지된 액터가 플레이어일경우
if (EDRCharacter && EDRCharacter->GetController()->IsPlayerController())
{
// 디버그 정보 색상 출력
OwnerComp.GetBlackboardComponent()->SetValueAsObject(AEnemy_EDR_AIController::TargetKey, EDRCharacter);
DrawDebugSphere(World, Center, DetectRadius, 16, FColor::Green, false, 0.2f);
DrawDebugPoint(World, EDRCharacter->GetActorLocation(), 10.0f, FColor::Blue, false, 0.2f);
DrawDebugLine(World, ControllingPawn->GetActorLocation(), EDRCharacter->GetActorLocation(), FColor::Blue, false, 0.2f);
return;
}
}
}
DrawDebugSphere(World, Center, DetectRadius, 16, FColor::Red, false, 0.2f);
}
Detect는 EnemyCharacter가 플레이어를 감지범위안에서 오버랩 했는지 감지하는 기능입니다.
플레이어 캐릭터인 EDRCharacter를 감지하거나 못한경우 시각적 디버깅으로 표현하도록 하였습니다.
감지한 플레이어 캐릭터를 블랙보드 변수인 Target에 저장합니다.
Enemy_EDR_BehaviorTree
비헤이비어트리에 적용한 모습입니다.
'Unreal Engine 5 > EDR_Project' 카테고리의 다른 글
EDR_Project / AnimInstance (0) | 2024.10.17 |
---|---|
EDR_Project / CanAttack (0) | 2024.10.17 |
EDR_Project / Patrol (0) | 2024.10.17 |
EDR_Project / BehaviorTree, BlackBoard (0) | 2024.10.17 |
EDR_Project / Character (0) | 2024.10.17 |