[내일배움캠프 Day43] BT 애니메이션 실행

2025. 2. 19. 20:51·내일배움캠프/TIL
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
'내일배움캠프/TIL' 카테고리의 다른 글
  • [내일배움캠프 Day46] AI 무리지어 이동 구현(Boids Algorithm)
  • [내일배움캠프 Day44] BlueprintImplementableEvent
  • [내일배움캠프 Day42] WIL
  • [내일배움캠프 Day42] 알고리즘 수업 Wrap-Up
개발자 밍
개발자 밍
dev0404 님의 블로그 입니다.
  • 개발자 밍
    Developer
    개발자 밍
  • 전체
    오늘
    어제
    • 분류 전체보기 (88)
      • 강의 (8)
        • UE Climbing System (3)
        • UE Dungeon (1)
        • HCI (4)
      • 책 (18)
        • 객체지향의 사실과 오해 (5)
        • Effective C++ (3)
        • 이득우의 게임 수학 (4)
        • 이것이 취업을 위한 컴퓨터 과학이다 (4)
        • 리뷰 (2)
      • C++ (2)
      • 알고리즘 (2)
      • 자료구조 (1)
      • Unreal (4)
      • 내일배움캠프 (52)
        • TIL (52)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Effective
    알고리즘
    게임수학
    c++
    컴퓨터구조
    컴퓨터 구조
    객체지향
    자료구조
    내일배움캠프
    언리얼
    그래픽스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
개발자 밍
[내일배움캠프 Day43] BT 애니메이션 실행
상단으로

티스토리툴바