2022. 10. 27. 16:40ㆍGameDev.[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 로 전이했고요.
그런데 위 과정이 가능하기위해서는, StateAttack 이 Idle 대해 알고 있어야합니다. StateAttack 이 StateIdle 과 연관관계이던지, 최소한 Machine 입장에서 StateIdle 을 실행하기위한 Root 의 상태는 무엇인지 알고 있어야 하므로, State를 만들 때에는 어떤 조건에서 어떤 State로 전이할것인가에 대한 정보들이 모두 포함되어있어야하고, State가 많아지고 Transition 이 많아질 수록 코드는 꼬이게 될 수 있습니다.
이를 개선하기위한 다양한 방법이 있습니다.
상태머신 자체를 하나의 노드로서 계층을 나누고 상태머신들을 핸들링 해야한다면 ?
-> HFSM (Hierarchical Finite State Machine) : 계층적 유한 상태 머신
A 상태머신 동작중에 B 상태머신을 동작시켰다가 B 상태머신이 종료된다면 다시 A 상태머신을 동작시켜야 한다면?
(ex. 기본동작 중 NPC 와 퀘스트를 진행하기위한 대화 상태머신 진행 후 다시 기본동작 머신 수행)
-> PushDownAutomata : stack 구조를 활용한 자동 머신
'GameDev.[Theory]' 카테고리의 다른 글
[FSM vs Behavior Tree] Part.4 - Behavior Tree 의 구현 (0) | 2022.11.07 |
---|---|
[FSM vs Behavior Tree] Part.3 - Behavior Tree 의 개념 (0) | 2022.11.03 |
[FSM vs Behavior Tree] Part.2 - FSM 의 구현 (0) | 2022.10.28 |