EDR_Project / CanAttack

 

플레이어가 공격 가능한 범위에 있는지 확인하는 비헤이비어트리 데코레이터입니다.

"이득우의언리얼 c++ 게임 개발의 정석" 을 참고하였습니다.

BTD_EDR_IsInAttackRange.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "BehaviorTree/BTDecorator.h"
#include "BTD_EDR_IsInAttackRange.generated.h"

/**
 * 
 */
UCLASS()
class EDR_API UBTD_EDR_IsInAttackRange : public UBTDecorator
{
	GENERATED_BODY()
	UBTD_EDR_IsInAttackRange();
protected:
	virtual bool CalculateRawConditionValue(UBehaviorTreeComponent & OwnerComp, uint8* NodeMemory) const override;
};

 

반응형

 

BTD_EDR_IsInAttackRange.cpp

// Fill out your copyright notice in the Description page of Project Settings.


#include "BTD_EDR_IsInAttackRange.h"
#include "Enemy_EDR_AIController.h"
#include "MyCharacter.h"
#include "EDR/YS/EDRCharacter.h"
#include "BehaviorTree/BlackboardComponent.h"

UBTD_EDR_IsInAttackRange::UBTD_EDR_IsInAttackRange()
{
	NodeName = TEXT("CanAttack");
}


bool UBTD_EDR_IsInAttackRange::CalculateRawConditionValue(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) const
{
	bool bResult = Super::CalculateRawConditionValue(OwnerComp, NodeMemory);

	// AIContorller가 제어하는 폰을 가져옴
	auto ControllingPawn = OwnerComp.GetAIOwner()->GetPawn();
	if (nullptr == ControllingPawn)
	{
		return false;
	}

	// 블랙보드의 Target 플레이어 캐스팅
	auto Target = Cast<AEDRCharacter>(OwnerComp.GetBlackboardComponent()->GetValueAsObject(AEnemy_EDR_AIController::TargetKey));
	if (nullptr == Target)
	{
		return false;
	}

	// 거리 조건 계산
	bResult = (Target->GetDistanceTo(ControllingPawn) <= 500.0f);
	return bResult;
}

 

블랙보드의 Target에 들어있는 플레이어 캐릭터Enemy사이의 거리를 계산한 결과를 bResult에 저장합니다.

 

 

Enemy_EDR_BehaviorTree

 

비헤이비어트리에 적용한 모습입니다.

'Unreal Engine 5 > EDR_Project' 카테고리의 다른 글

EDR_Project / Attack  (10) 2024.10.17
EDR_Project / AnimInstance  (0) 2024.10.17
EDR_Project / Detect  (0) 2024.10.17
EDR_Project / Patrol  (0) 2024.10.17
EDR_Project / BehaviorTree, BlackBoard  (0) 2024.10.17