인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

ajkdfj님의 프로필 이미지

작성한 질문수

이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해

강의 외 질문입니다..!

작성

·

17

·

수정됨

0

지금 AI가 플레이어가 공격할 때 플레이어가 움직이거나 또는 AI 뒤쪽으로 이동하면 AI가 플레이어를 향해 회전을 해야 하는데 회전을 하지 않습니다.. 강의 코드와 한 줄 정도 다른데 왜 안되는 것인지 모르겠습니다..

EBTNodeResult::Type UBTTask_Turn::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory)
{
	Super::ExecuteTask(OwnerComp, NodeMemory);

	APawn* NPC = OwnerComp.GetAIOwner()->GetPawn();	// NPC 가져오기
	if (NPC == nullptr)
	{
		return EBTNodeResult::Failed;
	}

	FName PlayerName = TEXT("Target");
	APawn* Player = Cast<APawn>(OwnerComp.GetBlackboardComponent()->GetValueAsObject(PlayerName));	// Target 가져오기
	if (Player == nullptr)
	{
		return EBTNodeResult::Failed;
	}

	float TurnSpeed = 1.0f;
	FVector LookTargetVector = Player->GetActorLocation() - NPC->GetActorLocation();
	FRotator LookTarget = FRotator(0.0f, LookTargetVector.Rotation().Yaw, 0.0f);	// 회전 값
	NPC->SetActorRotation(FMath::RInterpTo(NPC->GetActorRotation(), LookTarget, GetWorld()->GetDeltaSeconds(), TurnSpeed));

	return EBTNodeResult::Succeeded;
}

그리고 갑자기 루트 노드에서 멈춥니다.. 하위 노드들을 실행을 해야 하는데 루트노드에만 노란색으로 고정되어있는데 뭐를 확인해야 하나요?

답변 1

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. ajkdfj님.

AI가 플레이어를 향해 회전할 때 해당 코드에서 발생할 수 있는 문제에 대해 알아보겠습니다. AI가 플레이어를 즉시 바라보지 않는 이유는 태스크가 매 프레임 실행되지 않고, EBTNodeResult::Succeeded를 반환하면서 태스크가 종료되기 때문입니다.

문제 원인

현재 UBTTask_Turn 클래스의 ExecuteTask 메서드는 매 프레임마다 AI의 회전을 점진적으로 변경하려고 하지만, 실행 후 즉시 종료됩니다. 이 때문에 AI는 한 번 회전한 후 그대로 멈춰버립니다.

해결 방법

  1. Tick Function 사용:
    태스크의 지속적인 업데이트를 위해서는 Tick 함수로 회전 로직을 옮기는 것이 필요합니다. 그러나 Behavior Tree Task에서 Tick 함수를 사용하는 것은 일반적이지 않기 때문에 ServiceDecorator로 구현하는 것이 더 나을 수 있습니다.

  2. Parallel Node 활용:
    Behavior Tree 내에서 해당 태스크를 Parallel 노드와 함께 사용하여 지속적으로 실행할 수 있도록 구조를 변경할 수 있습니다. ServiceDecorator를 통해 AI의 회전 상태를 지속적으로 체크하고 변경할 수 있습니다.

참고 자료

여기 유사한 질문과 해결 방법을 다룬 게시물을 참고하시면 좋을 것 같습니다:
- BTTask_TurnTo 확장에 대한 추가적인 방법 논의 - Tick 함수나 Parallel Node의 사용 사례

우선은 AI의 회전 로직을 계속적으로 갱신하기 위한 설계와 Behavior Tree의 구조에 대해 다시 한 번 고찰해 보시길 권장드립니다. 문제가 해결되지 않거나 추가적인 기술 지원이 필요하다면 언제든지 질문해 주세요. 더 많은 정보와 코드가 도움이 될 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

ajkdfj님의 프로필 이미지

작성한 질문수

질문하기