EDR_Project / Detect

 

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