728x90

🏆 목차.

  1. 서론
  2. 본론
  3. 결론

 

🛒 서론

상태 패턴(State Pattern)

 

상태 패턴은 객체의 상태에 따라 행동을 바꾸는 데 유용한 디자인 패턴입니다.

주로 게임 개발, 사용자 인터페이스(UI) 구현, 그리고 상태 전환이 빈번할 경우 주로 사용됩니다.

상태 패턴은 상태를 클래스로 캡슐화하고, 상태 전환을 클래스 간의 참조 변경으로 처리하는데 이에 대한 예시로 캐릭터 애니메이션 상태(유니티 애니메이터), 네트워크 연결 상태, 툴 상태가 있습니다.

 

 

🎨 본론

 

예시 코드를 통해 설명드리겠습니다.

 

상태 인터페이스

public interface IState
{
    void OperateEnter();
    void OperateUpdate();
    void OperateExit();
}

 

유닛 걷기 상태(인터페이스 상속)

pulbic class Walk : IState
{
    public void OperateEnter()
    {
    	//걷기 상태 초기화
    }
    public void OperateUpdate()
    {
    	//걷기 상태 업데이트
    }
    public void OperateExit()
    {
        //걷기 상태 종료
    }
}

 

유닛 점프 상태(인터페이스 상속)

pulbic class Jump : IState
{
    public void OperateEnter()
    {
    	//점프 상태 초기화
    }
    public void OperateUpdate()
    {
    	//점프 상태 업데이트
    }
    public void OperateExit()
    {
        //점프 상태 종료
    }
}

 

스테이트 머신 클래스

public class StateMachine
{
    //현재 상태
    public IState CurrentState{get; private set;}
    
    public StateMachine(IState defaultState)
    {
    	CurrentState = defaultState;
    }
    
    public void SetState(IState state)
    {
    	if(CurrentState == state) return;
        //현재 상태 종료
    	CurrentState.OperateExit();
    	//다음 상태로 교체
    	CurrentState = state;
    	//바뀐 상태 진입
    	CurrentState.OperateEnter();
    }
    
    public void UpdateState()
    {
    	CurrentState.OperateUpdate();
    }
}

 

실제 사용 예시 코드

 

위 코드에 대해 대해  정리해 보겠습니다.

 

IState 인터페이스

  • 상태 진입, 상태 업데이트, 상태 나가기 함수를 선언합니다. 인터페이스이기 때문에 구현부는 포함하지 않습니다.

 

Walk, Jump... 클래스

  • IState를 상속받아 인터페이스에서 선언된 함수를 구현하는 클래스입니다
  • 각자 적합한 기능을 함수에 구현을 합니다

예시) Walk 클래스의 Enter에는 Walk 애니메이션을 작동시키고, Jump 클래스의 Enter에서는 Jump 애니메이션을 작동시킵니다.

 

StateMachine 클래스

  • 상태를 초기화하고 변경하는 클래스입니다
  • 업데이트 또한 Monobehavior를 상속받는 클래스에서 StateMachine의 UpdateState를 호출하여 사용할 수 있습니다

 

PlayerStateHandle 클래스

  • 개발 중인 게임의 플레이어 구현에 사용한 코드입니다
  • 플레이어의 state를 변경하면 해당 상태로 SetState 되어 해당 상태의 클래스가 작동되도록 구현했습니다

 

장점

  • 유연한 상태 전환 : 상태를 캡슐화하여 상태 전환 로직을 각 상태 클래스에 분리
  • 상태 전환을 더 쉽게 관리하고 확장할 수 있게 함
  • 가독성 향상 : 상태 전환 로직이 각 상태 클래스에 분리되어 있어, 코드의 가독성이 향상
  • 유지보수 용이성 : 상태를 추가 및 변경 시, 다른 상태 클래스의 영향 없이 독립적으로 작업

 

단점

  • 클래스 증가 : 상태별로 별도의 클래스가 필요하기 때문에 클래스의 수가 증가
  • 복잡성 증가 : 상태가 많아질수록 관리해야 할 클래스와 코드의 복잡성이 증가

 

상태 패턴을 사용해서 AI와 플레이어를 간단하게 구현할 수 있었지만 단점에서 볼 수 있듯 복잡성이 증가하는 문제가 발생했었습니다.

그래서 현재 개발 중인 게임에서는 Behavior Tree를 사용하여 상태를 시각적으로 관리하고 새로운 상태가 추가되더라도 복잡성이 증가하지 않도록 구현 중입니다. 이에 대해서는 추후 다시 작성하겠습니다.

 

🎯 결론

 

상태 패턴은 무조건 하나의 상태만 가지고 있어야 하는 경우 매우 유용하게 사용이 가능합니다.

이 패턴을 사용하면 상태 전환 로직을 깔끔하게 분리하고, 코드의 가독성과 유지보수성을 높일 수 있습니다.

하지만, 상태가 늘어나면 코드의 복잡성이 증가하는 문제로 상황에 맞게 적절하게 사용하는 것을 추천합니다.

728x90

+ Recent posts