FSM의 정의

FSM(Finite State Machine)은 유한 상태 기계로, 객체가 가질 수 있는 유한한 상태들과 그 상태들 간의 전환을 정의하는 모델입니다. 게임 개발에서 FSM은 캐릭터의 행동, 게임의 단계, UI의 상태 등을 관리하는 데 사용됩니다.

FSM 구현 방법

유니티에서 FSM을 구현하는 방법은 다양하며, 여기서는 하드코딩된 상태와 스크립트를 사용한 상태를 소개하겠습니다.

하드코딩된 상태

하드코딩된 상태는 상태를 코드 내에서 직접 관리하는 방법입니다.

// 상태 열거형 정의
public enum State
{
    Idle,
    Walking,
    Running,
    Jumping
}

public class Character : MonoBehaviour
{
    private State currentState = State.Idle;

    void Update()
    {
        switch (currentState)
        {
            case State.Idle:
                // Idle 상태의 행동 처리
                break;
            case State.Walking:
                // Walking 상태의 행동 처리
                break;
            // 다른 상태들도 비슷하게 처리
        }
    }

    // 상태 전환 메소드
    public void ChangeState(State newState)
    {
        currentState = newState;
    }
}

스크립트를 사용한 상태

스크립트를 사용한 상태는 각 상태를 별도의 스크립트로 구분하고, 상태 간 전환을 관리하는 방법입니다.

// 상태 인터페이스
public interface IState
{
    void Enter();
    void Execute();
    void Exit();
}

// 상태 관리자
public class StateMachine
{
    private IState currentState;

    public void ChangeState(IState newState)
    {
        if (currentState != null)
            currentState.Exit();

        currentState = newState;
        currentState.Enter();
    }

    public void Update()
    {
        if (currentState != null)
            currentState.Execute();
    }
}

// 구체적인 상태 클래스 예시
public class IdleState : IState
{
    public void Enter() { /* Idle 상태에 진입할 때의 로직 */ }
    public void Execute() { /* Idle 상태에서 수행할 로직 */ }
    public void Exit() { /* Idle 상태에서 나갈 때의 로직 */ }
}

// 사용 예시
public class Character : MonoBehaviour
{
    private StateMachine stateMachine = new StateMachine();

    void Start()
    {
        stateMachine.ChangeState(new IdleState());
    }

    void Update()
    {
        stateMachine.Update();
    }
}

적용 사례

  • 캐릭터 AI: 캐릭터가 서로 다른 상태(대기, 이동, 공격 등) 간을 전환하며, 각 상태에 맞는 행동을 할 수 있습니다.
  • 게임 메뉴 시스템: 메뉴, 설정, 게임 플레이 등의 다양한 화면 상태를 관리할 수 있습니다.
  • 인터랙티브 오브젝트: 오브젝트가 사용자의 입력이나 게임 이벤트에 따라 다양한 상태를 가질 수 있습니다.

주의 사항

FSM을 구현할 때는 상태 전환의 복잡성을 관리하고, 성능을 고려해야 합니다. 상태가 많아질수록 관리가 복잡해지므로, 상태 관리 로직을 명확하고 간결하게 유지하는 것이 중요합니다.