State Pattern

순후추·2023년 11월 14일
0

디자인패턴

목록 보기
7/11

State Pattern 의 장단점

장점

  • 캡슐화 : 코드를 수정하지 않아도 상태를 추가 할 수 있고, 클래스별로 상태패턴에 대한 기능을 나눌 수도 있고, 캡슐화가 되어 있어서 유지보수에 유리하다.

단점

  • 상태 변경을 부드럽게 하려면 많은 양의 코드를 필요로 한다.
    그러나 애니메이터, 애니메이션 기능을 적절히 활용하면 해결 할 수 있다.

구성 요소

  • Context : 상태를 변경함
  • IState : 각각 상태에 대한 기능을 적을때 쓰는 Interface
  • ConcreteState : 각각의 상태에 대한 기능을 적는 Class
  • Controller : 각각의 상태를 실행 시킬 Class

간단하게 쿠키런을 예시로 상태 패턴을 이용 해보려고 한다.

Jump, Run. Dead 세 가지 상태가 있을 것이다.
이를 토대로 코드를 만들어보았다.

public interface ICookieState
{
    public void Handle(CookieController cookieController);
}

public class CookieController : MonoBehaviour
{
    private float speed;
    private int curHp;
    private int maxHp;

    private CookieContext cookieContext;

    private ICookieState jumpState, deadState, runState;

    // example
    public void Jump()
    {
        cookieContext.Transition(jumpState);
        cookieContext.Transition();
    }

    public void Dead()
    {
        cookieContext.Transition(deadState);
        cookieContext.Transition();
    }

    public void Run()
    {
        cookieContext.Transition(runState);
        cookieContext.Transition();
    }

    private void Start()
    {
        Run();
    }

}

public class Jump : MonoBehaviour, ICookieState
{
    private CookieController _cookieController;

    public void Handle(CookieController cookieController)
    {
        if (!_cookieController)
            _cookieController = cookieController;

        // junp funtions........
        // something funtions.......
    }
}

public class Dead : MonoBehaviour, ICookieState
{
    private CookieController _cookieController;

    public void Handle(CookieController cookieController)
    {
        if (!_cookieController)
            _cookieController = cookieController;

        // dead funtions........
        // something funtions.......
    }
}

public class Run : MonoBehaviour, ICookieState
{
    private CookieController _cookieController;

    public void Handle(CookieController cookieController)
    {
        if (!_cookieController)
            _cookieController = cookieController;

        // run funtions........
        // something funtions.......
    }
}

public class CookieContext : MonoBehaviour
{
    public ICookieState curCookieState { get; set; }


    // Play
    public void Transition()
    {
        curCookieState.Handle();
    }


    // Transition
    public void Transition(ICookieState toState)
    {
        curCookieState = toState;
    }
}

대안

  • Enum, Class, Animator 로 대부분 대체 할 수 있다.
  • 행동 트리
    특히 게임 enemy(monster) AI 에게 적용하면 세부적으로 트리가 더 효율적일것이다.

  • 유한 상태 기계(FSM)
    Animator 와 같이 활용 할 수 있다.
profile
게임 개발 블로그

0개의 댓글

관련 채용 정보