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

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

ajkdfj님의 프로필 이미지

작성한 질문수

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

강의 외 질문입니다..!

작성

·

56

·

수정됨

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;
}

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

답변 2

0

이득우님의 프로필 이미지
이득우
지식공유자

음.. 어떤 부분을 수정해서 문제가 발생한 것일까요?
실행이 안되거나 BT가 루트노드에서만 멈추고 있다면 여러가지 복잡적인 이유가 있을 것 같은데, 해당 코드만으로는 제가 조언드리기가 쉽지 않네요.

ajkdfj님의 프로필 이미지
ajkdfj
질문자

지금 멈추는 BT가 BT_NPC인데 BT_NPC와 동일하게 BT_Attack을 만들어주었습니다. 근데 BT_Attack은 동작을 하는데 BT_NPC는 동작하지 않습니다. 수정을 한 부분은 없었는데 갑자기 루트노드에서 멈추었습니다.(이 문제는 언리얼 포럼에도 물어보았습니다..!)

이득우님의 프로필 이미지
이득우
지식공유자

루트 노드가 반짝인다는 것은 우선 동작은 한다는 것인데, 하위 노드로 안가는 문제는 컴포짓 노드로의 조건이 안맞아서 진행이 안되는 것으로 보여집니다. 각 조건을 한 번 확인해보세요.

ajkdfj님의 프로필 이미지
ajkdfj
질문자

image.png

데코레이터에 빨간 색 표시가 조건이 맞지 않아서 그렇다는 것인가요? 그럼 동일하게 만들어진 BT_Attack은 왜 실행이 되는 것인지 궁금합니다..

이득우님의 프로필 이미지
이득우
지식공유자

오른쪽의 시퀀서가 실패하는 것으로 보여지는데요.
다음 위치를 못 찾는게 아닌가 생각됩니다. 내비메시 설정은 잘 되었을까요?

아니면 Origin 값이 내비메시 가능한 지역에 올바로 설정되어 있는지도 한번 점검해보세요

ajkdfj님의 프로필 이미지
ajkdfj
질문자

알고보니까 TargetChase가 Selector 노드에 연결되어 있지 않아서 발생한 문제 같습니다..

플레이를 해보니 노드가 TargetChase가 연결되어 있지 않으면 빨간색 표시가 나타나고, 노드를 연결해주면 정상적으로 BT가 실행이 됩니다.

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님의 프로필 이미지

작성한 질문수

질문하기