FSM

LeemHyungJun·2024년 1월 31일
0

참고
https://www.aleksandrhovhannisyan.com/blog/implementing-a-finite-state-machine-in-cpp/#what-is-a-finite-state-machine
https://gameprogrammingpatterns.com/state.html
https://ansohxxn.github.io/design%20pattern/chapter11/
https://docs.unrealengine.com/4.27/ko/AnimatingObjects/SkeletalMeshAnimation/StateMachines/Overview/
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=jerrypoiu&logNo=221235988023

FSM (Finite State Machine)

1. FSM

  • 다양한 상태들 간의 전이와 그에 따른 동작을 모델링하는 방식
    • 유한한 갯수의 상태들을 가지며, 상태들 중 하나의 상태만 취하는 상황
    • 특정 조건이 되면 다른 상태로 변할 수 있어야 한다.
  • FSM을 쓰는 이유
    • 가능한 상태들을 명확히 규정할 수 있다.
    • 상태 중복을 피할 수 있다.
    • 유지보수가 좋다.
  • 예시(캐릭터의 점프를 구현하기)
    1) 특정 키를 눌러서 점프하는 코드를 작성했다.
if(input == PRESS_B)
{
	Jump();
}

2) 이단 점프를 막기 위해 bool 변수를 하나 도입해서 처리해준다.

if(input == PRESS_B)
{
	if(!bIsJumping)
    {
    	 bIsJumping = true;
     	 Jump();
    }
}

3) 아래 키보드를 누르면 엎드리고 떼면 일어서는 코드를 작성한다.

if(input == PRESS_B) 
{
	if(!bIsJumping)
    {
    	 bIsJumping = true;
     	 Jump();
    }
} 
else if(input == PRESS_DOWN) 
{
	if(!isJumping_) 
    {
		Duck();
    }
}
else if(input == RELEASE_DOWN) 
{
	Stand();
}

위처럼 하나의 기능이 추가될 때 마다 if 문이 늘어나고, 새로운 변수가 계속해서 늘어나게 된다는 문제점이 있다.
-> FSM으로 이러한 문제를 해결

  • 간단한 방법으로는 FSM 상태를 enum class로 만들어서 switch case문으로 처리할 수 있다.
  • switch case도 코드가 꼬일 수 있기 때문에 상태를 별도의 클래스로 캡슐화한 다음 현재 상태를 나타내는 객체에게 행동을 위임하는 방식을 사용

2. FSM 코드

https://www.aleksandrhovhannisyan.com/blog/implementing-a-finite-state-machine-in-cpp/#what-is-a-finite-state-machine

...

3. FSM in Unreal Engine

  • State Machine
    • 언리얼 엔진에서 애니메이션을 위해 구현되어 있는 기능
    • Animation Bluprint를 만들어서 사용 가능하다.

  • 위의 캐릭터 애니메이션 프로세스 흐름도를 아래의 state machine으로 구성할 수 있다.
  • 구성 요소
    • State
      • 캐릭터가 어떤 행동을 해야 할지에 대한 상태를 나타내기
      • 해당 state를 더블클릭하면 output animation pose를 결정하도록 되어있다.

  • Transition
    • 한 상태에서 다른 상태로 전환함에 있어서 어떤 식으로 전환할지를 정하기
    • 이때 transition rule에 따라 전환된다.

  • Conduit
    • transition은 한 상태에서 다른 상태로 일대일 대응관계이지만, conduit은 일대다, 다대다 대응이 가능하다.

0개의 댓글