유한상태기계(finite state machine, FSM)는 게임 에이전트에게 환상적인 지능을 부여하기 위한 선택 도구로 사용되어왔다.
다시 말해, 유한상태기계는, 주어지는 모든 시간에서 처해 있을 수 있는 유한 개의 상태를 가지고 주어지는 입력에 따라 어떤 상태에서 다른 상태로 전환시키거나 출력이나 액션이 일어나게 하는 장치 또는 그런 장치를 나타낸 모델이다.
FSM 이란 특정한 상태를 정의하기 위한 개념적 모델인 것이다.
여러개의 제한된 상태(State)가 존재하고 그 존재들이 특정 조건에 물려 서로 연결되어있는 형태를 의미한다.
유한 상태 기계의 간단한 예로는 집에 있는 전등 스위치를 들 수 있다.
스위치가 On일 때는 전등의 불이 들어오게 되고 그 상태가 유지된다.
만약 누군가가 와서 스위치를 Off하게 되면 전등의 불은 꺼지게 된다.
이때도 마찬가지로 누군가가 스위치를 On하기 전까지는 불이 꺼진 상태를 유지 할 것이다.
이처럼 유한상태기계도 어떤 상태를 유지 하고 있다가 특정한 이벤트가 발생하게 되면 조건에 맞는 상태로 생태가 변하게 되는 방식이다.
게임에서의 FSM #
- 아래의 그림은 게임에서 NPC나 Monster 등에 적용되는 간단한 AI 상태이다.


- 위의 그림같이 특정한 조건에 따라 그 조건으로 상태가 전환이 되면서 해당되는 상태를 처리하는 것을 FSM이라고 한다.
FSM을 왜 사용하는가? #
FSM을 사용하는 이유는 간단하다.
쉬운 개념의 적립, 각 상태와 형태가 코드상이 아닌 도표로써 나타내짐으로써 AI의 개념을 프로그래머 이외에 기획자 또는 제 3자가 쉽게 확인, 설계가 가능하기 때문이다.
그리고 정해진 룰이 있기 때문에 프로그래머 입장에서 코딩시 조금 더 안정성이 높은 코드를 만들어낼수 있다.
그리고 각각의 상태는 나위어져 있기 때문에 새로운 상태의 추가 삭제가 용의하다.
FSM이 모든 AI를 대변하는 것은 아니다. Fuzzy, 하드코딩 AI 등 게임에서는 여러 가지 형태가 병합되어있다.
위의 그림을 참고삼아 예를 들어보도록 하겠다. 아래의 몬스터 예상 공격패턴이 있다.
현재 한 마리의 Moster가 존재한다.
Moster의 공격대상은 당연히 Player이다.
Moster는 공격대상이 없을 때는 주위를 방황하며 걸어다니거나(Move) 제자리에서 혼자 무언가를 하고 있다.(Idle) 공격대상이 생겼을 경우 Moster는 해당 대상을 공격(Attack) 한다.
위의 패턴을 잘 보면 위의 그림으로 나타낸 도표로 다 표현할 수 있다.
그리고 FSM으로 구현되어져 있기 때문에 각각의 상태는 여러가지 형태로 변경될 수 있다.
예를 들자면 Attack 상태를 여러가지로 나위어 놓을 수 있다.
- 언제나 Critical한 공격만 하는 상태
- 아주 약한 공격을 여러 번 하는 공격 상태
- 장거리 공격을 하는 공격 상태
위와 같이 여러 가지 공격 상태를 정해두고 상태를 변환하는 것만으로도 다양한 형태의 AI를 가진 Moster가 구현될 수 있는 것이다.
FSM 장점 #
- 빠르고 코딩하기가 쉽다.
- 오류수정이 용이하다.
- 계산 부담이 없다.
- 직관적이다.
- 유연성이 있다.