언리얼 엔진

Unreal AI - BTService가 Tick을 완전히 대체할 수 있을까?

로안님 2025. 4. 11. 12:53

BTService가 Tick을 완전히 대체할 수 있을까?

BTService는 Unreal Engine AI 개발에서 굉장히 강력한 도구입니다. 상태 체크, 블랙보드 업데이트, 조건 분기 등에 모두 사용할 수 있죠. 특히 성능 측면에서 Tick()보다 훨씬 효율적이기 때문에 많은 개발자들이 BTService로 Tick을 완전히 대체할 수 있을까? 라는 질문을 하게 됩니다.

이 글에서는 그 질문에 대해 정확히 언제, 왜 Tick이 여전히 필요할 수 있는지를 살펴봅니다.


✅ BTService 주기를 줄이면 대부분의 Tick 역할을 대체할 수 있다

BTService는 Interval 값을 낮추면 0.1초, 심지어 그 이하 주기로도 실행 가능합니다. 이 경우 거의 Tick처럼 빠르게 반복 실행되기 때문에, 많은 상태 체크 로직을 커버할 수 있게 됩니다.

Interval = 0.1f;           // 초당 10회
RandomDeviation = 0.0f;    // 고정 주기

이렇게 설정하면 다음과 같은 작업은 충분히 가능합니다:

  • 블랙보드 상태 업데이트
  • 캐릭터 거리 확인
  • 단순 상태 판단 및 행동 제어

그러나, 모든 상황에서 완벽하게 대체 가능한 것은 아닙니다.


❗왜 BTService로 Tick을 완전히 대체할 수 없는가?

1. BT가 멈추면 BTService도 같이 멈춘다

Behavior Tree는 특정 상황에서 중단(Pause/Abort) 될 수 있습니다. 예:

  • AI가 죽음 상태에 들어감
  • Root 노드 중단됨

이 경우 BTService는 더 이상 호출되지 않습니다. 하지만 Tick()은 계속 동작하므로, BT 바깥의 보조 로직은 Tick에서 처리할 수밖에 없습니다.


2. BTService는 항상 BT 흐름 안에서만 작동한다

BTService는 특정 Selector/Sequence의 하위 노드로만 존재할 수 있습니다. 즉, 해당 노드가 실행 중이지 않으면 Service도 작동하지 않습니다.

반면, Tick()은 Actor나 Controller의 고유 루프이기 때문에 AI 상태나 행동 트리 상태에 관계없이 계속 실행됩니다.


3. Tick은 더 정밀한 제어가 가능하다

Tick()은 매 프레임마다 실행되며, 60FPS 기준 약 0.016초 간격입니다. 반면, BTService는 주기를 낮춰도 현실적으로 0.05~0.1초 수준이죠.

정밀한 물리 계산, 애니메이션 타이밍, 실시간 반응이 필요한 상황에서는 Tick이 더 적합합니다.


🎯 Tick이 꼭 필요한 대표적인 상황

상황 Tick 필요 여부

AI가 죽었을 때 회복 로직 유지 ✅ 필요함
외부 시스템 (FSM, AbilitySystem 등)과 연동 ✅ 필요함
실시간 거리 계산 및 반응 ✅ 필요함
디버깅, DrawDebug 등 시각화 ✅ 유용함

✅ 최적 전략: Tick과 BTService 병행 사용

가장 효율적인 방법은 두 가지를 조합하는 것입니다:

  • 일반적인 상태 체크/전투 판정: BTService
  • BT가 멈췄을 때도 필요한 기능: Tick
  • 실시간 반응이 중요한 물리 기반 처리: Tick
// Tick 예시
void ABaseAIController::Tick(float DeltaSeconds)
{
    Super::Tick(DeltaSeconds);

    if (bRecoverMode && !bActive)
    {
        MoveToRespawn();
    }
}

이렇게 하면 성능을 아끼면서도 안정적인 AI 로직 구성이 가능합니다.


✨ 마무리 요약

  • BTService는 대부분의 상태 로직을 커버할 수 있고, 성능적으로 뛰어나다.
  • 하지만 BT의 흐름에서 벗어난 로직, 정밀한 제어, 외부 시스템 연동에는 Tick이 여전히 필요하다.
  • 두 도구를 조합해서 상황에 맞게 쓰는 것이 가장 이상적인 전략이다.

📌 참고: Unreal AI - Tick 함수 vs BTService 성능 차이 ← 기초 개념이 궁금하다면 이 글을 먼저 읽어보세요!