1. 게임 인공지능
GameAI
상태구동형 에이전트의 디자인
By Changhoon Park
http://www.wawworld.me
Last Update : 2012. 03. 03
12년 3월 31일 토요일
2. 유한상태기계(FSM)란?
2
By Changhoon Park
http://wawworld.me
12년 3월 31일 토요일
3. FSM의 정의 (p46)
유한상태기계는 주어지는 모든 시간에서 처해 있을 수 있는
유한 개의 상태를 가지고 주어지는 입력에 따라 어떤 상태에
서 다른 상태로 전환시키거나 출력 이나 액션이 일어나게 하
는 장치 또는 그런 장치를 나타낸 모델이다.
3
By Changhoon Park
http://wawworld.me
12년 3월 31일 토요일
4. FSM의 정의 (p46)
• 유한 수의 상태를 가진다
• 외부로 부터 입력을 받아들인다
• 자신의 상태를 전환할 수 있다.
• 상태에서 출력이나 액션이 일어나게 한다.
4
By Changhoon Park
http://wawworld.me
12년 3월 31일 토요일
5. FSM의 아이디어 (p46)
객체의 행동을 쉽게 처리할수 있는 ‘덩어리’ 또는 상태들로
분해하는 것
5
By Changhoon Park
http://wawworld.me
12년 3월 31일 토요일
6. FSM의 아이디어 (p46)
예) 전등
• 상태의 수
• 외부 입력
• 상태 전환
• 출력/액션
6
By Changhoon Park
http://wawworld.me
12년 3월 31일 토요일
7. 게임에서 FSM의 이용 예 (p47)
Pac-Man에서 ghost의 행동
- 도피하기 상태 / 추격하기 상태
- 추격하기에서 도피하기로 전환하기 위한 조건
- 도피하기에서 추격하기로 전환하기 위한 조건
7
By Changhoon Park
http://wawworld.me
12년 3월 31일 토요일
8. FSM은 AI 프로그래머가 에이전트(NPC)에게
환상적인 지능을 제공하기 위해 선택한 도구
8
By Changhoon Park
http://wawworld.me
12년 3월 31일 토요일
9. FSM이 좋은 이유 (p45)
빠르고 코딩하기 쉬움
- 유한 상태를 구현하는 방법은 여러가지가 있음
9
By Changhoon Park
http://wawworld.me
12년 3월 31일 토요일
10. FSM이 좋은 이유 (p45)
오류 수정이 쉬움
- 각 상태에 추적자 코드를 추가하여 오류수정이 가능
10
By Changhoon Park
http://wawworld.me
12년 3월 31일 토요일
11. FSM이 좋은 이유 (p45)
계산 부담이 없음
- 코드화된 규칙으로 if-this-then-that과 같은 사고 절차
11
By Changhoon Park
http://wawworld.me
12년 3월 31일 토요일
12. FSM이 좋은 이유 (p45)
직관적임
- 의사소통이나 아이디어 교환을 개선하기 위한 방법으로 제공
12
By Changhoon Park
http://wawworld.me
12년 3월 31일 토요일
13. FSM이 좋은 이유 (p45)
유연함
- 새로운 상태와 규칙을 쉽게 추가하여 에이전트 행동의 법위를 간단하게 확장
13
By Changhoon Park
http://wawworld.me
12년 3월 31일 토요일
14. FSM을 구현하는 방법
14
By Changhoon Park
http://wawworld.me
12년 3월 31일 토요일
15. enum StateType {
RunAway, Patrol, Attack
};
IF-THEN / SWITCH (p48) void Agent::UpdateState(StateType CurrentState)
{
switch (CurrentState) {
더 많은 상태와 조건이 추가되는 경우? case state_RunAway:
EvadeEnemy();
if (Safe()) {
초기 상태 진입할 때 / 상태에서 빠져 나 ChangeState( state_Patrol);
올 때 / 보통 상태일 때 }
break;
case state_Patrol:
FollowPatrolPath();
if (Threatened()) {
if (StrongerThanEnemy()) {
ChangeState( state_Attack);
} else {
ChangeState( state_RunAway);
}
}
break;
case state_Attack:
if (WeakerThanEnemy()) {
ChangeState( state_RunAway);
} else {
15
BashEnemyOverHead();
}
break;
}//end switch
}
By Changhoon Park
http://wawworld.me
12년 3월 31일 토요일
16. 상태 전환표
•표를 정기적으로 질의하며 수신한 자극을 근거로 상태 전환 (작은 칩)
•각 상태는 에이전트 외부에 존재하는 별개의 객체로 모델링 (카트리지)
•새로운 상태 추가 (카트리지 추가, 상태규칙 칩 재프로그램)
16
By Changhoon Park
http://wawworld.me
12년 3월 31일 토요일
17. 내장된 규칙들
상태들 자신의 내부에 상태 전환을 위한 규칙을 내장
카트리지
- 카트리지 내부에 상태전환 칩의 규칙을 포함
- 외부 논리(상태전환 칩)에 의존하지 않음
- 새로운 카트리지를 추가할 때 머리에 손댈 필요 없음
- 각 카트리지는 다른 카트리지가 존재하고 있음을 알고 있음
17
By Changhoon Park
http://wawworld.me
12년 3월 31일 토요일
18. 내장된 규칙들
상태들 자신의 내부에 상태 전환을 위한 규칙을 내장
객체로 캡슐화된 상태
- 상태전환을 위한 논리 포함
- 모든 상태의 공통 인터페이스를 가짐
class State class Troll
{ {
public: /* ATTRIBUTES OMITTED */
virtual void Execute(Troll* troll)=0; State* m_pCurrentState;
}; public:
/* INTERFACE TO ATTRIBUTES OMITTED */
void Update() {
m_pCurrentState->Execute(this;)
}
void ChangeState(const State* pNewState) {
delete m_pCurrentState;
18 m_pCurrentState = pNewState;
}
};
By Changhoon Park
http://wawworld.me
12년 3월 31일 토요일
19. 내장된 규칙들
상태들 자신의 내부에 상태 전환을 위한 규칙을 내장
//------------------------------State RunAway //-----------------------------State_Sleep
class State_Runway : public State class State_Slepp : public State
{ {
void Execute(Troll* troll) { void Execute(Troll* troll) {
if(troll->isSafe()) { if(troll->isThreatened()) {
troll->ChangeState(new State_Sleep()); troll->ChangeState(new State_RunAway())
} else { } else {
troll->MoveAwayFromEnemy(); troll->Snore();
} }
} }
}; };
19
By Changhoon Park
http://wawworld.me
12년 3월 31일 토요일