[FSM vs Behavior Tree] Part.1 - FSM 의 개념

2022. 10. 27. 16:40GameDev.[Theory]

반응형

FSM 의 개념 

 

FSM (Finite State Machine) 

유한 상태머신

 

우선 상태머신이란 특정 상태에 대한 일정한 동작을 수행하는 기계를 의미합니다.

정해져있는 상태들에 따라 연산을 수행하고 각 상태들은 특정 조건에서 다른 상태들로 전이될 수 있습니다. 

'특정 상태' 에서 '특정 조건' 일 때 '다른 특정 상태' 로 전환하는지 명시되기때문에, 컨셉이 간단하고 직관적이어서 코드를 봤을 때 누구나 쉽게 이해할 수 있고, 또 쉽게 작성할 수 있기 때문에 일반적으로 생산성이 높습니다. 

구조 자체가 GOTO 구문 컨셉과 비슷하기때문에 상태들이 많아지고 구조가 복잡해질 수록 코드가 꼬일 가능성이 높은 단점이 있습니다.

 

단계별/ 조건별 애니메이션이나 캐스팅과정 등이 각 상태에 들어가야할 경우, Root-StateMachine 에 Sub-StateMachine 들을 두는 형태로 만들어서 FSM 을 좀 더 세분화 할 수 있습니다.

그러면 Sub-StateMachine이 일련의 과정을 처리한 후 반환값에 따라 Root-StateMachine 이 반환값에 해당하는 Sub-StateMachine 으로 전이하는 형태의 구조체계가 됩니다.

 

아래 그림을 보면 [Machine] 이 현재 State의 Task() 를 호출하며, 이 Task() 는 다음으로 전이해야하는 State가 어떤것인지 반환해줍니다. 이전과 동일한 State를 반환한다면 해당 State가 아직 실행중이라는 뜻이므로 전이를 하지 않습니다. 

그래서 첫 그림에서는, StateAttack 이 Attack 을 반환함으로서 아직 작업을 수행중이라는것을 알려주어서 State가 전이되지 않았고, 두 번째 그림에서는, StateAttack 이 Idle 을 반환함으로서 수행하던 작업이 끝났으니 StateIdle로 넘어가면 된다는것을 Machine 에게 알려주었습니다. Machine 은 ChangeState() 를 통해 StateIdle 로 전이했고요.

 

Attack Sub-StateMachine 이 Attack 을 반환해서 다음 사이클에도 여전히 Root-Machine 이 StateAttack 의 Task() 를 호출하고 있음.
Attack Sub-StateMachine 이 Idle을 반환해서 다음 사이클에 Root-Machine 이 StateIdle 의 Task() 를 호출하고 있음.

그런데 위 과정이 가능하기위해서는, StateAttack 이 Idle 대해 알고 있어야합니다. StateAttack 이 StateIdle 과 연관관계이던지, 최소한 Machine 입장에서 StateIdle 을 실행하기위한 Root 의 상태는 무엇인지 알고 있어야 하므로, State를 만들 때에는 어떤 조건에서 어떤 State로 전이할것인가에 대한 정보들이 모두 포함되어있어야하고, State가 많아지고 Transition 이 많아질 수록 코드는 꼬이게 될 수 있습니다. 

 

상태 마법진

 

이를 개선하기위한 다양한 방법이 있습니다. 

상태머신 자체를 하나의 노드로서 계층을 나누고 상태머신들을 핸들링 해야한다면 ?

-> HFSM (Hierarchical Finite State Machine) : 계층적 유한 상태 머신

 

A 상태머신 동작중에 B 상태머신을 동작시켰다가 B 상태머신이 종료된다면 다시 A 상태머신을 동작시켜야 한다면? 

(ex. 기본동작 중 NPC 와 퀘스트를 진행하기위한 대화 상태머신 진행 후 다시 기본동작 머신 수행)

-> PushDownAutomata : stack 구조를 활용한 자동 머신

 

 

반응형