info8995 님의 블로그

커스텀 BTTask 및 BTService 구현 본문

TIL(Today I Learned)/Unreal Engine

커스텀 BTTask 및 BTService 구현

info8995 2025. 5. 9. 19:31

오늘은 언리얼 엔진의 AI 시스템에서 기본 노드(MoveTo, Wait 등)를 넘어 커스텀 BTTask와 BTService를 직접 구현해보고, AI와 상호작용 가능한 오브젝트 간의 복합적 행동 흐름을 구성하는 실습을 진행했다.


 핵심 내용 요약

1️⃣ BTTask_FindInteractiveObject

  • AI가 지정된 태그(예: "Interactive")를 가진 액터를 탐색하고, 가장 가까운 오브젝트를 블랙보드에 저장하는 태스크.
  • UGameplayStatics::GetAllActorsWithTag()를 사용하여 주변 오브젝트 탐색.
  • 블랙보드에 ClosestObject, ClosestObjectLocation 저장.

2️⃣ BTTask_InteractWithObject

  • 블랙보드에 저장된 오브젝트와의 거리 체크 후 상호작용 진행.
  • 인터페이스(IInteractiveObject)를 통해 대상 오브젝트가 상호작용을 지원하는지 확인.
  • 애니메이션 몽타주가 있으면 재생하고, 없으면 바로 Interact() 호출.

3️⃣ AnimNotify_Interaction

  • 애니메이션 중 특정 프레임에 상호작용을 트리거하는 커스텀 노티파이.
  • 노티파이 발생 시, 블랙보드에서 대상 액터를 가져와 Interact() 실행.

4️⃣ BTService_EmotionChanger

  • 일정 시간마다 AI의 감정 상태를 무작위로 변경하는 서비스.
  • 감정 상태(EEmotionalState)에 따라 이동 속도(MaxWalkSpeed)가 다르게 설정됨.
  • TickNode() 내에서 감정 상태를 랜덤으로 선택, 블랙보드에 저장 및 속도 반영.

✅ 테스트 결과

  • BTTask_FindInteractiveObject → AI가 자동으로 가장 가까운 Interactive 오브젝트 탐색 성공.
  • BTTask_InteractWithObject → 오브젝트 상호작용 성공 (머티리얼 변경 확인).
  • BTService_EmotionChanger → 감정 상태가 주기적으로 바뀌며 이동 속도도 동적으로 조절됨.
  • 커스텀 애님 노티파이(AnimNotify_Interaction)를 통해 정확한 타이밍에 인터랙션 발동 확인.

🔍 느낀 점

  • 인터페이스블랙보드를 함께 사용하니 AI의 행동을 동적으로 제어하기 매우 용이했다.
  • BTTask와 BTService의 개념 차이를 명확히 알 수 있었고, 서비스는 지속적/주기적 로직에 적합하다는 점이 인상 깊었다.
  • 애니메이션 몽타주와 노티파이를 연동하여 애니메이션 타이밍과 로직을 정밀하게 통제할 수 있는 구조는 실전 게임 개발에도 매우 유용할 것 같다.

📅 내일 할 일

  • AI들끼리 상호작용하는 스토리텔링 기반 행동 설계 시도 (ex. 상처받은 AI가 화를 낸다거나(감정변화) 뛰어서 도망가는 등의 상호작용 ).
  • RVO 회피 로직을 감정 상태 및 상호작용 흐름에 연동하여 적용해보기.
  • 상호작용 조건을 좀 더 정밀하게 설정하고, 다양한 감정 상태 별 애니메이션 세분화해보기.