작성
·
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가 루트노드에서만 멈추고 있다면 여러가지 복잡적인 이유가 있을 것 같은데, 해당 코드만으로는 제가 조언드리기가 쉽지 않네요.
루트 노드가 반짝인다는 것은 우선 동작은 한다는 것인데, 하위 노드로 안가는 문제는 컴포짓 노드로의 조건이 안맞아서 진행이 안되는 것으로 보여집니다. 각 조건을 한 번 확인해보세요.
오른쪽의 시퀀서가 실패하는 것으로 보여지는데요.
다음 위치를 못 찾는게 아닌가 생각됩니다. 내비메시 설정은 잘 되었을까요?
아니면 Origin 값이 내비메시 가능한 지역에 올바로 설정되어 있는지도 한번 점검해보세요
알고보니까 TargetChase가 Selector 노드에 연결되어 있지 않아서 발생한 문제 같습니다..
플레이를 해보니 노드가 TargetChase가 연결되어 있지 않으면 빨간색 표시가 나타나고, 노드를 연결해주면 정상적으로 BT가 실행이 됩니다.
0
안녕하세요, 인프런 AI 인턴입니다. ajkdfj님.
AI가 플레이어를 향해 회전할 때 해당 코드에서 발생할 수 있는 문제에 대해 알아보겠습니다. AI가 플레이어를 즉시 바라보지 않는 이유는 태스크가 매 프레임 실행되지 않고, EBTNodeResult::Succeeded
를 반환하면서 태스크가 종료되기 때문입니다.
현재 UBTTask_Turn
클래스의 ExecuteTask
메서드는 매 프레임마다 AI의 회전을 점진적으로 변경하려고 하지만, 실행 후 즉시 종료됩니다. 이 때문에 AI는 한 번 회전한 후 그대로 멈춰버립니다.
Tick Function 사용:
태스크의 지속적인 업데이트를 위해서는 Tick
함수로 회전 로직을 옮기는 것이 필요합니다. 그러나 Behavior Tree Task
에서 Tick
함수를 사용하는 것은 일반적이지 않기 때문에 Service
나 Decorator
로 구현하는 것이 더 나을 수 있습니다.
Parallel Node 활용:
Behavior Tree
내에서 해당 태스크를 Parallel
노드와 함께 사용하여 지속적으로 실행할 수 있도록 구조를 변경할 수 있습니다. Service
나 Decorator
를 통해 AI의 회전 상태를 지속적으로 체크하고 변경할 수 있습니다.
여기 유사한 질문과 해결 방법을 다룬 게시물을 참고하시면 좋을 것 같습니다:
- BTTask_TurnTo 확장에 대한 추가적인 방법 논의 - Tick
함수나 Parallel Node
의 사용 사례
우선은 AI의 회전 로직을 계속적으로 갱신하기 위한 설계와 Behavior Tree
의 구조에 대해 다시 한 번 고찰해 보시길 권장드립니다. 문제가 해결되지 않거나 추가적인 기술 지원이 필요하다면 언제든지 질문해 주세요. 더 많은 정보와 코드가 도움이 될 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
지금 멈추는 BT가 BT_NPC인데 BT_NPC와 동일하게 BT_Attack을 만들어주었습니다. 근데 BT_Attack은 동작을 하는데 BT_NPC는 동작하지 않습니다. 수정을 한 부분은 없었는데 갑자기 루트노드에서 멈추었습니다.(이 문제는 언리얼 포럼에도 물어보았습니다..!)