본문 바로가기

TIL

[ 24.06.19 ] 내일배움캠프 TIL - FSM

[ ps ]

 

[ 백준 / C++ ] 14499 : 주사위 굴리기 (tistory.com)

 

[ Unity ]

 

FSM( Finite State Machine )을 그대로 해석하면 유한한 개수의 상태들로 이루어진 기계를 말한다.

여러 상태 간의 전환을 기반으로 동작하는 시스템이라고 생각하면 된다.

 

FSM은 크게 State, Transition Condition, Action으로 구성된다.

 

State는 시스템이 취할 수 있는 상태,

Transiton Condition은 상태 간의 전환을 결정하는 조건,

Action은 상태에 따라 수행되는 동작을 말한다.

 

State는 기본 베이스를 상속하는 방식으로 정말 다양한 형태를 만들 수 있다.

이를 통해 State를 명확하게 정의할 수 있고 Transition Condition을 곁들여 복잡한 동작을 구현할 수 있다.

 

예를 들어 BaseState를 베이스로 하여

플레이어와 관련되 있으면 PlayerState, 적과 관련되 있으면 EnemyState로 구분할 수 있다. 

 

이 중 PlayerState를 베이스로 하여

땅에 있으면 PlayerGroundState, 떨어져 있으면 PlayerAirState, 공격 중이면 PlayerAttackState로 구분할 수 있다.

 

이 중 PlayerGroundState를 베이스로 하여

가만히 있으면 PlayerIdleState, 걸으면 PlayerWalkState, 뛰면 PlayerRunState로 다시 구분할 수 있다.

 

이처럼 다양한 상태를 객체지향적으로 늘릴 수 있다.

 

다음은 기본적인 State Machine 구현에 쓰이는 스크립트이다.

public interface IState
{
    public void Enter();
    public void Exit();
    public void HandleInput();
    public void Update();
    public void PhysicsUpdate();
}

public abstract class StateMachine
{
    protected IState currentState;

    public void ChangeState(IState state)
    {
        currentState?.Exit();
        currentState = state;
        currentState?.Enter();
    }

    public void HandleInput()
    {
        currentState?.HandleInput();
    }

    public void Update()
    {
        currentState?.Update();
    }

    public void PhysicsUpdate()
    {
        currentState?.PhysicsUpdate();
    }
}