플레이어가 공격 가능한 범위에 있는지 확인하는 비헤이비어트리 데코레이터입니다.
"이득우의언리얼 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 |