언리얼 엔진

Unreal AI - BTService 설계 전략: 통합형 vs 상태별 분리형

로안님 2025. 4. 11. 13:03

Unreal Engine BTService 설계 전략: 통합형 vs 상태별 분리형

Unreal Engine의 AI 시스템에서 BTService는 AI의 상태를 블랙보드와 동기화하는 핵심 도구입니다. 그런데 여러 개의 상태(예: IsActive, IsInCombat, IsStunned, IsRecovering)를 체크해야 할 때, 이걸 한 Service에서 모두 처리할 것인가? 아니면 상태별로 나눠서 여러 Service를 만들 것인가? 하는 고민이 생기죠.

이 글에서는 두 가지 방식의 장단점을 비교하고, 어떤 상황에서 어떤 전략이 더 적합한지를 안내합니다.


✅ 통합형 Service: 여러 상태를 한 번에 체크

예시

  • 하나의 BTService에서 다음 상태들을 모두 체크
    • IsActive
    • IsRecovering
    • CurrentHP
    • IsTargetInRange

장점

항목 설명

✅ 성능 효율 블랙보드 접근/상태 계산을 최소화할 수 있음
✅ 관리 편함 상태들이 한 파일에 있어 추적과 수정이 쉬움
✅ 복합 로직 대응 여러 상태를 조합한 블랙보드 로직 작성이 쉬움
✅ Behavior Tree가 깔끔 서비스 노드 수가 적어 트리가 간결함

단점

항목 설명

❌ 코드 복잡도 증가 상태가 많아질수록 TickNode가 비대해짐
❌ 의존성 증가 하나의 상태 변경이 다른 로직에 영향을 줄 수 있음
❌ 테스트 어려움 특정 상태만 디버깅하기 어려움

✅ 상태별 분리형 Service: 상태 하나당 Service 하나

예시

  • UBTService_CheckActive
  • UBTService_CheckRecovering
  • UBTService_CheckTargetDistance

장점

항목 설명

✅ 책임 분리 각 상태의 역할이 명확함
✅ 디버깅 편함 특정 상태만 쉽게 테스트 가능
✅ 팀 작업 유리 분업화에 적합, 충돌 위험 감소
✅ 리팩터링 쉬움 각각 독립적으로 유지보수 가능

단점

항목 설명

❌ 트리 복잡도 증가 Behavior Tree에 서비스가 많아짐
❌ 계산 중복 가능성 예: 거리 계산을 여러 서비스가 각각 수행할 수 있음
❌ 성능 손해 우려 실행 주기를 각각 설정하면 중복 실행 가능성 있음

🎯 어떤 상황에 어떤 전략을 써야 할까?

상황 추천 방식

상태 수가 적고 간단함 상태별 분리형
상태 수가 많고 상호 의존함 통합형
퍼포먼스가 중요한 상황 통합형 (계산 최소화)
빠른 테스트와 디버깅이 중요함 분리형
팀 작업 시 충돌을 줄이고 싶음 분리형

💡 실전 팁: 섞어서 쓰는 전략

현실에선 두 방식을 조합하는 경우가 많습니다.

예시:

  • 전투 관련 상태는 통합형 (IsActive, InCombat, TargetDistance)
  • 회복, 부활 관련 상태는 분리형 (IsRecovering, IsDead)

이렇게 하면 성능과 구조 모두를 챙길 수 있습니다.


✅ 마무리 요약

  • 통합형은 성능과 구조적 효율이 뛰어남 (하지만 복잡해짐)
  • 상태별 분리형은 명확하고 디버깅과 팀 작업에 유리함
  • 실제 게임에서는 두 방식을 상황에 따라 적절히 조합하는 것이 가장 좋다

BTService를 어떻게 설계하느냐는 곧 AI의 유연성과 유지보수 난이도에 직접적인 영향을 줍니다. 상황에 맞는 전략을 선택해보세요!