게임개발/스터디

[스터디] FSM 패턴과 사용해야 하는 이유

감물 2024. 4. 11. 18:11

FSM(finite-state machine)은 상태(state)를 기반으로 동작을 제어하는 방식을 구현하기 위한 디자인패턴이다. FSM의 핵심은 단 하나의 상태만을 가진다는 점이다. 상태를 기준으로 어떤 동작을 수행할지 결정하기 때문에 현재 상태만 알 수 있으면 어떤 동작을 수행하려 하는지 명확히 파악할 수 있고 구현이 쉽다는 장점이 있다. 

 

    private void Update()
    {
        UpdatePlayerDirection();
        MovePlayer();
        CollectEnv();
    }

 

FSM 패턴은 주로 플레이어나 몬스터가 동작할 때 많이 사용한다. 플레이어나 몬스터는 Idle, Attack, Defense,  Move 등 다양한 상태를 가지게 되는데 보통 이들은 Update문에서 계속 해서 동작하게 한다.

 

    public enum CreatureState
    {
        Idle,
        Skill,
        Moving,
        OnDamaged,
        Dead
    }

 

먼저 Enum값으로 플레이어나 몬스터의 동작들의 상태를 지정하고

 

    public override void UpdateController()
    {
        switch (CreatureState)
        {
            case Define.CreatureState.Idle:
                UpdateIdle();
                break;
            case Define.CreatureState.Skill:
                UpdateSkill();
                break;
            case Define.CreatureState.Moving:
                UpdateMoving();
                break;
            case Define.CreatureState.Dead:
                UpdateDead();
                break;
        }
    }

 

그리고 실시간으로 상태를 체크하여 상태에 맞는 함수를 발동한다.

 

    void MovePlayer()
    {
        if (CreatureState == CreatureState.OnDamaged)
            return;

        _rigidBody.velocity = Vector2.zero;

        Vector3 dir = _moveDir * MoveSpeed * Time.deltaTime;
        transform.position += dir;    
    }

 

FSM의 장점을 잘 보여주는 함수이다. MovePlayer는 현재 Update문에서 계속 돌아가고 있는 함수이다. 이 때 만약에 몬스터로부터 대미지를 입었다면 플레이어의 움직임을 멈추어야 하는데 이를 구현하기가 쉽지 않을 것이다. 그러나 상태 머신 디자인 패턴을 플레이어에게 적용하면 간단하게 상태를 체크하고 Move상태가 아니라면 return을 해주면 간단해진다.

 

https://dodobug.tistory.com/16

 

[Unity] FSM - 유한 상태 기계

FSM(finite-state machine)은 상태(state)를 기반으로 동작을 제어하는 방식을 구현하기 위한 디자인 패턴이다. FSM의 핵심은 단 하나의 상태만을 가진다는 점이다. 상태를 기준으로 어떤 동작을 수행할지

dodobug.tistory.com