6-20. 15조 FSM(유한 상태 머신)

keubung·2024년 12월 23일

1. FSM(유한 상태 머신)

유한 상태 머신(Finite State Machine, FSM)은 컴퓨터 과학에서 널리 사용되는 설계 패턴으로, 시스템의 상태와 그 상태 간의 전환(Transition)을 정의하는 데 사용된다. FSM은 복잡한 로직을 단순화하고, 코드의 가독성을 높이며 유지 보수를 용이하게 만든다.


1. FSM의 기본 개념

FSM은 이름 그대로 "유한한 상태(Finite States)"로 구성된다. 시스템은 특정 시점에 하나의 상태에만 존재하며, 특정 조건이 충족되었을 때만 다른 상태로 전환된다.

1. 상태(State)

  • 시스템이 존재할 수 있는 "단계"를 의미.
  • 예: 게임 캐릭터의 "Idle(대기)", "Run(달리기)", "Jump(점프)" 상태.

2. 이벤트(Event)

  • 상태 간 전환을 트리거하는 조건이나 입력.
  • 예: 플레이어가 점프 버튼을 누르는 것.

3. 전환(Transition)

  • 한 상태에서 다른 상태로 전환되는 과정을 정의.
  • 예: "Idle" 상태에서 점프 버튼 입력이 발생하면 "Jump" 상태로 전환.

4. 초기 상태(Initial State)

  • FSM이 시작될 때 기본적으로 진입하는 상태.

5. 종료 상태(Final State)

  • FSM이 종료되었음을 나타내는 상태(선택 사항).

2. FSM의 장점

  • 가독성 향상
    : 시스템의 상태와 상태 간 전환을 명확하게 정의하여 코드의 흐름을 쉽게 이해할 수 있다.

  • 유지 보수 용이
    : 새로운 상태를 추가하거나 기존 상태를 수정할 때 다른 상태와의 연관성을 쉽게 파악할 수 있다.

  • 에러 감소
    : 상태와 전환을 명시적으로 정의하므로, 예기치 않은 동작을 최소화할 수 있다.


3. FSM의 예시

간단한 게임 캐릭터의 상태 머신

  • Idle: 캐릭터가 아무 행동도 하지 않을 때.
  • Run: 캐릭터가 이동할 때.
  • Jump: 캐릭터가 점프할 때.

각 상태 간 전환 조건

  • Idle ⇨ Run: 방향키 입력.
  • Run ⇨ Idle: 방향키 입력 중지.
  • Idle ⇨ Jump: 점프 버튼 입력.
  • Run ⇨ Jump: 점프 버튼 입력.
  • Jump ⇨ Idle: 점프가 끝난 후.

4. FSM 구현 예제

⇨ 캐릭터의 상태를 관리하는 FSM의 기본 구조

  1. 상태 인터페이스 정의
public interface IState
{
    void Enter(); // 상태에 진입할 때 호출
    void Execute(); // 상태가 활성화되어 있는 동안 호출
    void Exit(); // 상태를 떠날 때 호출
}
  1. 상태 클래스 작성
public class IdleState : IState
{
    public void Enter()
    {
        Debug.Log("Entering Idle State");
    }

    public void Execute()
    {
        Debug.Log("Executing Idle State");
        // 방향키 입력 시 Run 상태로 전환
    }

    public void Exit()
    {
        Debug.Log("Exiting Idle State");
    }
}

public class RunState : IState
{
    public void Enter()
    {
        Debug.Log("Entering Run State");
    }

    public void Execute()
    {
        Debug.Log("Executing Run State");
        // 입력 중지 시 Idle 상태로 전환
    }

    public void Exit()
    {
        Debug.Log("Exiting Run State");
    }
}
  1. FSM 관리 클래스 작성
public class StateMachine
{
    private IState currentState;

    public void ChangeState(IState newState)
    {
        currentState?.Exit(); // 현재 상태 종료
        currentState = newState; // 새 상태로 전환
        currentState.Enter(); // 새 상태 진입
    }

    public void Update()
    {
        currentState?.Execute(); // 현재 상태 실행
    }
}
  1. 상태 전환 로직 연결
public class PlayerController : MonoBehaviour
{
    private StateMachine stateMachine;
    private IdleState idleState;
    private RunState runState;

    void Start()
    {
        stateMachine = new StateMachine();
        idleState = new IdleState();
        runState = new RunState();

        stateMachine.ChangeState(idleState); // 초기 상태 설정
    }

    void Update()
    {
        stateMachine.Update();

        // 입력에 따라 상태 전환
        if (Input.GetKeyDown(KeyCode.W))
        {
            stateMachine.ChangeState(runState);
        }
        else if (Input.GetKeyUp(KeyCode.W))
        {
            stateMachine.ChangeState(idleState);
        }
    }
}

	추 후 monster에 적용시켜야 할 듯
profile
김나영(Unity_6기)

0개의 댓글