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

더 공부할 자료

스크립터블 오브젝트를 능숙하게 사용하는 능력은 이제 유니티 게임 개발에 필수적으로 요구되고 있습니다.

특히 AI 코딩 시대가 되면서 데이터와 코드를 분리해서 작업하는 방식의 중요성이 더 커졌습니다. 코드를 더 작게, 기능별로 쪼개어 작성해야 관리가 편하기 때문입니다.

"유니티 6 스크립터블 오브젝트: 기초에서 활용까지"는 유니티 입문 단계를 끝내고 좀 더 심화된 지식을 익히고자 하는 프로그래머를 대상으로 쓰여진 책입니다. 책 내용은 다음 링크를 참고하시기 바랍니다.

책 내용 살펴 보기