본문 바로가기
개발/기본) 디자인패턴

디자인패턴 ) FSM- 유한상태머신(Finite State Machine)

by 테샤르 2019. 11. 5.

FSM- 유한 상태 머신(Finite State Machine)

 

유한 상태 머신이라고해서 상태를 기반으로 동작하는 개념의 방식을 말한다.

 

상태를 기반으로 처리되기 때문에 한 번에 한 개의 상태만 처리가 된다. 상태에 기반한 조건을 처리하기 때문에 상태가 변경이 되면 상태에 대한 종료 및 다른 상태로의  변환 과정을 처리한다.

반응형

 

상태는 여러가지 상태를 다중으로 처리하지 않고 Only One 인 방식으로 처리한다.

FSM은 게임로직에서 많이 사용을 하는 것 같다. 게임에서는 일정한 조건을 만족을 할 때에 대한 조건이 상당히 많은 편이다. 다른 애플리케이션에 비해서. 그래서 FSM을 기반으로 메인 로직과 같이 처리하는 경우가 많다.

 

 

예시는 다음과 같다.

 

유닛이 있고 유닛은 각각 여러가지 상태가 존재한다.

1) 생성

2) 이동

3) 공격

4) 죽음

 

유닛이 제일 먼저 상태가되는것은 생성이다. 생성과 동시에 죽음이 처리되지 않는다. 

FSM의 특성상 어떤 상태로 변경되기 위해서는 상태 머신에서의 상태의 시작과, 상태의 종료에 대한 상태가 명확하다.

 

주요 상태의 처리 내용은 다음의 개념을 포함한다.

 

상태(State)

전이(Change)

이벤트(Event)

행동(Action)

 

게임에서 구현방식은 State Machine을 Singleton Pattern으로 구현을 하고 

나머지 상태를  State Machine에 넣는 방식으로 구현한다.

 

State Machine의 주요 메소드는 다음과 같다.

 

public interface IBaseState
{

    void StateEnter();

    void StateExit();

    void StateChange();

    void StateUpdate();
    
}

public class StateInit : IBaseState
{
    
    public void StateEnter(){}

    public void StateExit(){}

    public void StateChange(){}

    public void StateUpdate(){}

}


 

public class StateController
{
    private IBaseState currentState = null;
    
    public void Update()
    {
		if(currentState ==null)
        	return;
            
        currentState.StateUpdate();
	}

    public void SetState(IBaseState nextState)
    {

        // 다음 state로 이동구현

        if (currentState != null)
            currentState.StateExit();


        currentState = nextState;
        currentState.StateEnter();

    }
}

StateController를 통해서 상태를 변경하고 IBaseState를 상속받은 상태를 넣어주면 된다.

 

 

여러가지 상태 값이 있는 게임에서 많이 활용하는 로직이기 때문에 한번 구현해놓으면 매우 좋다.

FSM의 상태값으로 데이터 및 처리의 흐름도 명확하게 알 수 있다. 

 

 

 

 

 

반응형

댓글