[언리얼] behaviour Tree에서 isatlocation노드와 MoveTo 노드

jh Seo·2024년 11월 10일

언리얼

목록 보기
9/18

개요

isatlocation은 현재 행동트리의 액터가 설정해둔 키값과 설정한 허용반경 거리만큼 떨어져있는지 체크하는 함수다.
move to 노드는 현재 행동트리의 액터가 설정해둔 키값과 설정한 거리만큼 떨어진 지점에 도달할때까지
navmesh를 이용해 움직이게 한다.

move to 노드를 사용해서

블랙보드에 세팅된 key값인 player에게 다가가는 부분을 move to노드를 이용해 처리하고 있었다.
문제는 move to 노드로 제어권이 가서 움직이기 시작하면 다른 노드로 가지않고 계속 move to함수가 실행이 되었다.

내 생각대로라면 매번 is at location을 체크하고
허용 범위 벗어나있다면 move to노드를 통해 움직이여야 하지만
막상 실행해보니이 이 녀석은 moveto로 이동한 순간 빠져나오질 못했다.

왜인가 하고 고민하던 중 혹시 isatlocation이
aicontroller가 컨트롤하는 폰이 아니라
aicontroller 자체의 액터와 비교하나 싶어서
거리 계산하는 부분을 오버라이딩을 통해 다시 짜봤다.

하지만 계속 isatlocation을 통과하는 것이였다..

bool UBTDecorator_CustomIsAtLocation::CalculateRawConditionValue(UBehaviorTreeComponent& OwnerComp , uint8* NodeMemory) const
{
	const UBlackboardComponent* BlackboardComp = OwnerComp.GetBlackboardComponent();
	if ( BlackboardComp == nullptr ) { return false; } // 목표 위치
	AActor* DetectedPlayerActor = Cast<AActor>(BlackboardComp->GetValueAsObject(TEXT("DetectedPlayer"))); 
	FVector TargetLocation = FVector::Zero();
	if ( DetectedPlayerActor ) {
		TargetLocation = DetectedPlayerActor->GetActorLocation(); 
	}
	AAIController* AIController = Cast<AAIController>(OwnerComp.GetOwner());

	AActor* OwnerActor = AIController->GetPawn();
	FVector OwnerLocation = OwnerActor->GetActorLocation();
	// 두 지점 간의 거리를 계산
	float Distance = FVector::DistXY(OwnerLocation , TargetLocation);
	// 허용 반경과 비교 
	float AcceptRadius = 2000.f;
	// 로그 출력 
	UE_LOG(LogTemp , Log , TEXT("Distance to Target: %f, Acceptable Radius: %f") , Distance , AcceptableRadius); // 거리가 허용 반경 이내에 있는지 확인합니다. 
	return Distance <= AcceptableRadius;
}

그래서 엉뚱한 isatlocation함수만 들여보고 있다가 설마하고 떠올랐다.

해결

바로 블랙보드에서 설정한 키값 액터와 해당 액터가 설정해둔 허용반경 거리이상이면
EBTNodeResult::InProgress를 반환해서 제어권을 쥐고있는게 아닌가 하는 생각이였다.

바로 TimeLimit 데코레이터 노드를 추가하니 behavior tree 에디터창에서
해당시간 지나고 잘 isAtLocation을 체크하는 모습을 볼 수 있었다 ㅜㅜ

profile
코딩 창고!

0개의 댓글