6. 일반적인 AI
•센서를 통해 주변을 인지
•메모리에 타겟이나 제반 정보를 기록
•디시젼 로직에서 상황을 판단하고
일련의 커맨드를 실행
•캐릭터 액션을 수행
WORLD
SENSOR ACTOR
Perception Animation
MEMORY
DECISION
LOGIC
AI
7. FSM : Finite State Machine (유한 상태 기계)
오토마타 시간에 졸면서 배운 그 FSM
이거 왜 쓰는가?
책에 나오니까
다들 쓰고 있다고 하니까
8. 디시젼 로직 With FSM
IDLE COMBAT
RETREAT
적 발견
퇴치
못당하겠다
사생결단도주 성공
대부분 이런 형태로 시작
9. 어떻게 더 구체화 할 것인가
여기서 문제가 발생 !
State를 나누기가
Transition을 리와이어링 하기가
IDLE COMBAT
RETREAT
적 발견
퇴치
못당하겠다
사생결단도주 성공
오마이갓 -_-
매우 곤란
10. 일반적인 해결책 #1 @ 한국
여기서부터는 하드 코딩 !
각 State, 각 Transition을
여러 가지 패턴으로 하드 코딩
패턴을 조합하는 식으로 AI 로직 구현
새로운 움직임이 필요하면 해당 패턴을 다시 하드 코딩
IDLE COMBAT
RETREAT
적 발견
퇴치
못당하겠다
사생결단도주 성공
ex) IDLE_SLIME, IDLE_ORC, COMBAT_REACTIVE, …
ex) ORC = IDLE_ORC + COMBAT_AGGRESSIVE + RETREAT_NEVER
11. 일반적인 해결책 #2 @ 한국
스테이트 커맨드 부분을 모듈화
& 스크립트나 XML로 조합
기본적인 플로우 컨트롤
좀 더 코드 재활용도가 높음
Ex)
[IDLE]
LOOP
WAIT 10~20 sec
PATROL
LOOP_END
[ATTACK1]
TARGET near
APPROACH
ATTACK melee
WAIT 10 sec
[ATTACK2]
TARGET ranged
APPROACH
USE_SKILL A
WAIT 20 sec
[STRATEGY]
…
IF RANGED ATTACK2
ELSE ATTACK1
이것도 더 이상 FSM은 아님
12. 일반적인 해결책 #2 @ 한국
이정도면 되지 않나요?
네. RPG 자코캐릭터 AI 만드는 데는 충분합니다
그러나..
보스몹의 다양한 패턴
생활하는 NPC
미리 정의된 스테이트 안에 갇혀 버림. 확장이 제한됨
이런 것은 구현하기 힘듭니다
13. 일반적인 해결책 #3 @ 서양
PvE가 컨텐츠의 거의 전부인 콘솔에서는
온라인 게임보다 AI가 훨씬 중요한 요소
훨씬 복잡한 환경 요소
NPC가 생활도 하고 성장도 하고…
FABLE 2
SPORE
그래서 결국… ?
14. 일반적인 해결책 #3 @ 서양
HFSM : Hierarchical Finite State Machines
적 발견
퇴치
못당하겠다
사생결단도주 성공
패트롤
HIDE SHOOT
RELOAD
보다 다양한 AI를 만들 수 있으나
유지 보수 코스트는 여전히 높다
Brute-Force 하게 나누는 대신
State를 적절히 모듈화해나감
State 모듈의 재활용
16. BT 개요
•사실은 HFSM을 보다 일반화한 것
– 계층적으로 State를
나누어가는데 집중
– 나누다보니 굳이 State가
아니라도 되게 되었음
– 트리 탐색형
명령 체계로 일반화됨
HALO 2 BT
melee
shoot
grenade
uncover
pursue
cover
sleep
fight
search
hide
idle
root
17. BT 개요
•구조적인 장점
– 단순한 하부 구조
(그래프 <> 트리) 구현 코스트도 적다
– Divide & Conquer 로
작업을 쪼개기 쉬움
– 모듈 재활용이 용이,
읽기도 쉽고, 유지 보수가 간편…
melee
shoot
grenade
uncover
pursue
cover
sleep
fight
search
hide
idle
root
HALO 2 BT
18. BT 개요
•최근 가장 HOT 한 AI 트렌드
– HALO 2 대성공 이후
– SPORE, GTA 등에서 Adapt
– 기존의 HFSM에서 BT로
이전해가는 추세
melee
shoot
grenade
uncover
pursue
cover
sleep
fight
search
hide
idle
root
HALO 2 BT
하지만 BT가 완전히 새로운 개념은 아니고
기존의 방법론을 일반화, 체계화한 것
22. Decider 기반 BT(HALO BT 1.5)
•보다 HFSM에 가까운 형태
•Spore에서 사용
•Decider 부분이 FSM과 유사
– 일종의 State Set
•Behavior는
개별 액션
ROOT
FLEE
GUARD
FIGHT
EAT
IDLE
YELL_FOR_HELP
FIGHT
PATROL
REST
FIND_FOOD
EAT_FOOD
PLAY
REST
FLIP
ROLL
DANCE
DECIDER
BEHAVIOR
23. Decider 탐색
매 틱마다 순서에 따라
Decider Function을 재평가
ROOT
FLEE
GUARD
FIGHT
EAT
IDLE
YELL_FOR_HELP
FIGHT
PATROL
REST
FIND_FOOD
EAT_FOOD
PLAY
REST
FLIP
ROLL
DANCE
Activated
Evaluation
24. Decider 탐색
Priority가 앞선 Decide Function이
Accept 되면
ROOT
FLEE
GUARD
FIGHT
EAT
IDLE
YELL_FOR_HELP
FIGHT
PATROL
REST
FIND_FOOD
EAT_FOOD
PLAY
REST
FLIP
ROLL
DANCE
Activated
Evaluation
Accepted !
25. Decider 탐색
Activate되었던 기존 노드를 클리어
ROOT
FLEE
GUARD
FIGHT
EAT
IDLE
YELL_FOR_HELP
FIGHT
PATROL
REST
FIND_FOOD
EAT_FOOD
PLAY
REST
FLIP
ROLL
DANCE
Activated
Evaluation
Accepted !
HALT
26. Decider 탐색
…한 뒤, Child를 탐색
ROOT
FLEE
GUARD
FIGHT
EAT
IDLE
YELL_FOR_HELP
FIGHT
PATROL
REST
FIND_FOOD
EAT_FOOD
PLAY
REST
FLIP
ROLL
DANCE
Activated
Evaluation
Accepted !
Parent Decide는 Child Decide의 부분집합
(Parent가 Accept하고 Child가 Reject 할 수 없음)
32. 트리를 매 프레임 다 탐색?
Decider에 Pre-Condition을 두어 탐색을 가속
Time Check
DecisionFlag
Decide Function
매 00초 마다만 검사
Enable/Disable Mask
33. Alex’s BT
•Alex J. Champandard
RockStar 개발자 출신, AiGameDev 운영자
요즘 BT 제일 열심히 선전하고 있는 사람
•이 아저씨 모델은 Halo BT 1.5 보다 좀 더
BT를 일반화한 것
•매우 심플해서 바닥부터 구현할 때 용이
35. Halo BT와의 차이
Leaf는 Condition 혹은 Action
Condition도 Leaf node임
Condition
Action
액터 상태, 이벤트 체크
충돌 등등..
소리를 내거나
애니메이션을 틀거나…
36. Halo BT와의 차이
Parent Node는
Sequence 혹은 Selector
계속 진행
Fail 종료
Sequence
Child가 Success이면
순서 대로 진행
모두 S면 결과도 S
37. Halo BT와의 차이
Parent Node는
Sequence 혹은 Selector
Selector
Child가 Fail이면
순서 대로 진행
하나라도 S면 결과도 S
Success 종료
계속 시도
38. 트리 탐색 과정의 예 Halo에서는 Decide에 따라
탐색할지 말지 결정되지만
여기서는 Leaf 까지
내려가서 조건을 판단
39. Alex 모델의 장점
•구현이 간단
S / F 의 리턴 값과 Tick만으로 구성된
기본 Node, Seq / Sel (compositor) 클래스만으로
AI 기반이 완성! (반나절이면 된다!)
•Decider와 Behavior가 전혀 다른
Halo 모델에 비해, 컨디션을 분해하기 용이
40. Alex 모델의 부가적인 패턴들
기능이 추가된 Seq / Sel
- 랜덤 Seq / Sel
Decorator
- 자식을 건드리지 않고
기능을 추가
Wait 멍!멍!
Timer 최대 n초간
Loop 여러번
Wrapper
Fail 무시
42. AI 작업의 리팩토링이 용이
•Tree의 노드로 분해하면 됨
SEQ
공격 상태이거나
타게팅할 적이 근처에 있으면
적을 타게팅하고
적에게 접근해서 공격
Condition Action
SEQ
공격 상태이면
타겟이 공격 범위
안에 있으면
SEQ
공격
SEL
타겟에 접근
43. AI 작업의 리팩토링이 용이
•SubTree나 Node를 재사용 가능
공격 상태이면
타겟이 공격 범위
안에 있으면
SEQ
공격
SEL
타겟에 접근
타겟이 공격 범위
안에 있으면
SEQ
공격
SubTree를 모듈 처럼 사용할 수 있다
45. 그 밖의 장점
•BT 구조를 그대로 플래닝에 활용할 수 있음
– Pre-Evaluation 펑션을 만들어
트리 탐색 / 결과 예측해볼 수 있음
•비쥬얼 툴 제작이 용이
Brainiac Designer 2.1
46. 그 밖에 주의할 점
•BT 노드의 탐색 순서가 행동에 영향을 미친다
•BT 노드는 서로간에 의존성이 없어야 한다
•BT 노드는 Blackboard나 게임 옵젝트에서
정보를 얻어 와야 함
ex) <공격> 노드는 타겟 정보를
<타게팅> 노드에서 전달 받는 것이 아니라
게임 옵젝트의 ‘현재 타겟’ 값을 읽어와 처리
47. 그 밖에 주의할 점
•FSM과 BT는 구조적인 방향성이 다르다
– FSM : ‘상태’를 정의하고 이벤트에 따라 다른 상태로 바뀌
는 과정을 구조화
– BT : AI가 달성할 소정의 목표를 정의하고 이것들을 서브
태스크로 나누어 운용
48. 그 밖에 주의할 점
•BT에서의 이벤트 처리는 FSM과 다르다
– FSM 처럼 다른 상태로 ‘점프’ 하는 것 보다는
– 현재 노드로부터 발생한 상황을 처리하는 서브트리로 분
기해서 작업을 처리하는 쪽으로 작업
– 다른 브랜치의 서브 트리를 복사해와서 써도 무방!
Ex) 회피중에 공격을 받는 경우
•FSM : 회피 State에서 다른 State로 전이해서 처리…
•BT : [공격 받은 경우]를 처리하는 서브 트리를 회피 밑에 복사
해서 회피중 피격 상황에 대한 세부 처리…
49. 결론 : 이제 FSM은 잊어버리고 BT로 가자!
•State를 고민하지 않아도
빠르게 동작을 구현해볼 수 있다
(State 비슷한 것이 필요하다면 나중에 묶어서 만들면 됨)
•코드를 다시 봐도 읽을 수 있다
•코드 리팩토링과 모듈화가 용이하다
•확장성이 높음
50. References
Spore Behavior Tree Docs, Chris Hecker
http://chrishecker.com/My_Liner_Notes_for_Spore
Handling Complexity in the Halo 2 AI, Damian Isla
http://www.gamasutra.com/gdc2005/features/20050311/isla_01.shtml
GAME::AI++ (Source Code)
http://aigamedev.com/premium/releases/gameai-06/
AIGameDev - Behavior Tree Related Articles
http://aigamedev.com/