EBTNodeResult::Type UBTTask_DrinkWater::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory)
{
Super::ExecuteTask(OwnerComp, NodeMemory);
AAIController* AIController = OwnerComp.GetAIOwner();
if (!AIController) return EBTNodeResult::Failed;
AAnimal* AICharacter = Cast<AAnimal>(AIController->GetPawn());
if (!AICharacter) return EBTNodeResult::Failed;
if (AICharacter->DrinkMontage)
{
AICharacter->PlayAnimMontage(AICharacter->DrinkMontage);
return EBTNodeResult::Succeeded;
}
return EBTNodeResult::Succeeded;
}
현재 PlayAnimMontage() 호출 후에 애니메이션이 종료될 때까지 대기하는 코드가 없어 애니메이션을 실행한 후 곧바로 Succeeded를 반환하기 때문에, BT가 즉시 다음 동작으로 넘어가 버립니다.
즉, DrinkWater Task 실행 → 애니메이션 시작 → 즉시 Succeeded 반환 → BT가 다시 실행이 되어 애니메이션의 앞부분만 계속해서 실행되는 문제가 발생했습니다.
이를 해결하기 위해 즉시 Succeeded가 아닌 InProgress를 반환하고 애니메이션이 끝나면 Succeeded 반환을 해주도록 수정하였습니다.
#include "AI/Creatures/BTTask_DrinkWater.h"
#include "AIController.h"
#include "AI/Creatures/Animal.h"
UBTTask_DrinkWater::UBTTask_DrinkWater()
{
bNotifyTick = true;
}
EBTNodeResult::Type UBTTask_DrinkWater::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory)
{
Super::ExecuteTask(OwnerComp, NodeMemory);
AIController = OwnerComp.GetAIOwner();
if (AIController == nullptr)
{
return EBTNodeResult::Failed;
}
AICharacter = Cast<AAnimal>(AIController->GetPawn());
if (AICharacter == nullptr)
{
return EBTNodeResult::Failed;
}
if (AICharacter->DrinkMontage)
{
UAnimInstance* AnimInstance = AICharacter->GetMesh()->GetAnimInstance();
if (AnimInstance)
{
AICharacter->PlayAnimMontage(AICharacter->DrinkMontage);
return EBTNodeResult::InProgress;
}
}
return EBTNodeResult::Failed;
}
void UBTTask_DrinkWater::TickTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, float DeltaSeconds)
{
Super::TickTask(OwnerComp, NodeMemory, DeltaSeconds);
UAnimInstance* AnimInstance = AICharacter->GetMesh()->GetAnimInstance();
if (!AnimInstance->Montage_IsPlaying(AICharacter->DrinkMontage))
{
FinishLatentTask(OwnerComp, EBTNodeResult::Succeeded);
}
}
위의 코드는 아래와 같습니다.
- ExecuteTask에서 애니메이션 시작
- TickTask에서 애니메이션 종료 여부 확인
- 애니메이션 종료 시 FinishLatentTask 호출하여 Task 완료
'내일배움캠프 > TIL' 카테고리의 다른 글
[내일배움캠프 Day46] AI 무리지어 이동 구현(Boids Algorithm) (0) | 2025.02.24 |
---|---|
[내일배움캠프 Day44] BlueprintImplementableEvent (0) | 2025.02.20 |
[내일배움캠프 Day42] WIL (5) | 2025.02.18 |
[내일배움캠프 Day42] 알고리즘 수업 Wrap-Up (0) | 2025.02.18 |
[내일배움캠프 Day41] 언리얼 AI 구현 (2) | 2025.02.17 |