작성
·
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 인턴입니다. 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
의 구조에 대해 다시 한 번 고찰해 보시길 권장드립니다. 문제가 해결되지 않거나 추가적인 기술 지원이 필요하다면 언제든지 질문해 주세요. 더 많은 정보와 코드가 도움이 될 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.